FakeItEasy 代理方法调用实际实现

2024-05-12

我正在尝试将对假对象的调用代理到实际的实现。这样做的原因是我希望能够使用 Machine.Specifications 的 WasToldTo 和 WhenToldTo ,它们仅适用于接口类型的伪造。

因此,我正在执行以下操作来代理对我的真实对象的所有调用。

public static TFake Proxy<TFake, TInstance>(TFake fake, TInstance instance) where TInstance : TFake
{
    fake.Configure().AnyCall().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray()));
    return fake;
}

我会像这样使用它。

var fake = Proxy<ISomeInterface, SomeImplementation>(A.Fake<ISomeInterface>(), new SomeImplementation());

//in my assertions using Machine.Specifications (reason I need a fake of an interface)
fake.WasToldTo(x => x.DoOperation());

但问题是这仅适用于 void 方法,因为 Invokes 方法不对返回值执行任何操作。 (动作参数而不是功能)

然后我尝试使用 WithReturnValue 方法来执行此操作。

public static TFake Proxy(TFake fake, TInstance instance) where TInstance : TFake
{
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray()));
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray()));
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray()));
    //etc.
    return fake;
}

但是 Invokes 方法仍然无法按照我想要的方式工作(仍然是 Action 而不是 Func)。所以返回值还是没有使用。

有没有办法用当前的最新版本来实现这一点?

我已经在 FakeItEasy github 存储库中提交了一个问题。https://github.com/FakeItEasy/FakeItEasy/issues/435 https://github.com/FakeItEasy/FakeItEasy/issues/435


偷我的FakeItEasy github 存储库中的响应 https://github.com/FakeItEasy/FakeItEasy/issues/435#issuecomment-69754142:

您可以创建一个假对象来包装现有对象,如下所示:

var wrapped = new FooClass("foo", "bar");
var foo = A.Fake<IFoo>(x => x.Wrapping(wrapped));

(示例取自创建赝品 > 显式创建选项 https://fakeiteasy.readthedocs.io/en/stable/creating-fakes/#explicit-creation-options)

That should将所有调用委托给底层对象,但通常需要注意的是任何重定向的调用都必须是可重写的 https://fakeiteasy.readthedocs.io/en/stable/what-can-be-faked/#what-members-can-be-overridden.

我希望这有帮助。如果没有,请回来再解释一遍。也许我会更好地理解它。

哦,要小心Configure机制。它在 FakeItEasy 2.0.0 中消失。 首选的习惯用法是

A.CallTo(fake).Invokes(…); // or
A.CallTo(fake).WithReturnType<bool>(…); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FakeItEasy 代理方法调用实际实现 的相关文章

随机推荐

  • 如何截取访客的页面屏幕截图?

    如何截取访客的页面屏幕截图 就像 Gmail 错误填充程序一样 https i stack imgur com Bi2QT png https i stack imgur com Bi2QT png 我认为这是一种方法 http html2
  • Eclipse:缺少 Java 构建路径

    我正在尝试使用 Eclipse 来使用适用于 Android 的 Google SDK 教程 我能够让前两个项目正常工作 但是当运行第三个 R java 时消失了 所以我放弃了 我根据练习 3 的解决方案集制作了一个全新的包 它充满了错误
  • 使用 lodash 方法 flatten 和 find 在 json 对象中查找值

    使用 lodash 我想找到一个 id 为 3229 的团队 我尝试关注但它没有返回任何内容 var team chain data teams flatten divisionTeams find id 3229 value 这是我的笨蛋
  • 使用 CSP 防止自动点击链接 XSS 攻击

    当将 CSP 用于稍微不同的目的 沙箱 时 我意识到一个非常简单的自动点击链接似乎甚至可以绕过相对严格的 CSP 我所描述的内容如下 内容安全政策 default src none script src unsafe inline 还有身体
  • 如何通过解析导入来组合并获取单个 Python 文件

    我正在尝试获取单个 Python 文件作为输出 我有一个 Python 脚本 其中有多个此类导入 from that import sub 导入来自所有本地模块 而不是来自系统或 Python 库 有什么方法可以解决这些问题并获得一个完整的
  • RubyMine 不能使用 Guard 吗?

    由于某些无法解释的原因 RubyMine 会自动保存您所做的每一个更改 因此每次击键都会触发 Guard 运行您的测试 最可笑的是 显然没有办法禁用这个自动保存 功能 我只是想知道 RubyMine 似乎是 Rails 开发人员中非常流行的
  • 响应.WriteFile

    有一个具有特定语法的 URL 用于下载文件 用户在文本框中输入文件名并按下下载按钮 在单击事件中 将调用 Response WriteFile 将文件发送到客户端 现在我想创建另一个带有页面的网站 用户在其中输入文件名并按下载按钮来下载该文
  • 使用 Git 的 Spring Cloud 配置服务器 - 无法克隆或签出存储库连接超时

    我正在使用 GIT 在 Spring Cloud Config Server 上进行 POC Spring Boot 1 5 3 RELEASE 爪哇1 8 弹簧工具套件https github com kishornpatil https
  • 使用 Visual Studio Tools for Docker 部署和调试远程 Linux Docker 容器

    我试图弄清楚如何使用部署到远程容器适用于 Docker 的 Visual Studio 工具 并调试我的 ASP NET Core 应用程序 实际上 我正在以下场景中工作 我的开发机器是 Hyper V 虚拟机 Docker is inst
  • 什么是“矢量化”?

    现在好几次了 我在 matlab fortran 其他一些 中遇到这个术语 但我从来没有找到解释它是什么意思 它有什么作用 所以我在这里问 什么是矢量化 例如 循环矢量化 是什么意思 许多CPU具有 向量 或 SIMD 指令集 它们同时对两
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不
  • 致命错误 C1001:编译器中发生内部错误(编译器文件“msc1.cpp”,第 1325 行)

    当我编译代码时 错误指向以下类 该错误在两行上突出显示 如下所示 tm validFrom tm validUntil struct t SslCertData final struct t Contact TCHAR Organizati
  • 具有多种类型的 C# 泛型类型推断

    我有以下通用方法 用于将一种类型的输入对象序列化为超类型 如下所示 public string SerialiseAs
  • chrome css 动画上的抖动

    尝试使用两个具有相同背景图像 svg 的居中 div 制作一个从中心淡入图像的 css 动画 并为其宽度和背景位置设置动画 问题是 在 chrome 上 存在严重的抖动问题 也许是 chrome 循环执行动画步骤 而不是同时执行它们 这是j
  • 如何向 ItemsControl 中的 WPF 按钮添加相同的命令

    如何将命令添加到 wpf 按钮 该按钮是ItemsControl并正在修改ItemsSource itself 这是我的 XAML
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • Angular 2 - 加载时共享服务

    我正在尝试将服务共享给组件 为此 我创建了 service ts 其中代码如下 import Subject from rxjs Subject export class CommonService CommonList new Subje
  • 如何使用 React 制作垂直选项卡

    有人可以为我提供一种使用 React 创建垂直选项卡的方法吗 我尝试了各种npm包 如react web tabs reactstrap和react bootstrap 最后两个只有水平选项卡的示例 React web tabs在其文档中有
  • 更改 jQuery UI 选项卡的选定选项卡

    这个问题之前已经被问过几次了 但没有一个与我的情况相似 我有 jQuery Tabs 控件 可以通过 ajax 加载我的选项卡 div ul li a href gt Information a li ul div
  • FakeItEasy 代理方法调用实际实现

    我正在尝试将对假对象的调用代理到实际的实现 这样做的原因是我希望能够使用 Machine Specifications 的 WasToldTo 和 WhenToldTo 它们仅适用于接口类型的伪造 因此 我正在执行以下操作来代理对我的真实对