c# - 如何独立于模拟框架使用 Machine.Fakes 模拟 'out' 参数?

标签 c# unit-testing mocking rhino-mocks machine.fakes

我遇到了 Machine.Fakes 的僵局。我不知道如何模拟 out参数使用 Machine.Fakes 设备。因为a bug在 RhinoMocks 中,我将 mfakes 适配器切换为 FakeItEasy。据我所知,任何适配器都应该可以互换。

问题是这导致“out”测试失败,看起来像这样的东西不再编译,因为Arg是 Rhino.Mocks。

The<IMembershipService>()
    .WhenToldTo(x => x.CreateUser(Param<string>.IsAnything,
        Param<bool>.IsAnything,
        Param<object>.IsAnything, 
        out Arg<MembershipCreateStatus>
            .Out(MembershipCreateStatus.UserRejected)
            .Dummy))
    .Return(user);

我尝试使用“虚拟”局部变量,将其设置为与原始 Arg<T> 相同的值param 将它设置为,但这导致我的测试失败——似乎该值没有被传递! Arg<T>确实有解决方案,但我不能再使用它了,因为它是 Rhino.Mocks 的一部分。

最佳答案

Machine.Fakes 不处理这种情况。它根本没有实现。

我个人不使用 out 参数,并且(如果我真的需要返回多个返回值)在这种情况下使用元组 (Tuple) 或自定义类。这就是为什么它从来没有真正放在我的优先级上。

我没有研究它,但在 Machine.Fakes 中实现 ref 和 out 参数的处理可能是不可行的。在多个模拟框架之上实现包装器的挑战之一是,为了成功,所有模拟框架都需要在它们的工作方式上有一个共同点。 Machine.Fakes 现在也不支持模拟事件,因为我无法找到所有这些事件的共同点(仅针对两个 NSubstitute/FakeItEasy 与 Rhino/Moq)。

在我看来,您目前有两个选择:

  1. 如果您控制我们正在讨论的界面,则可以通过元组或自定义类绕过该问题。
  2. 如果您不拥有该接口(interface),您始终可以针对 Alexander Gross 建议的情况恢复到底层模拟框架。

很抱歉没有给你更好的答案;-)

  • 比约恩

关于c# - 如何独立于模拟框架使用 Machine.Fakes 模拟 'out' 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720423/

相关文章:

c# - 将 int 隐式转换为 double

c# - 如何在 C# 中配置 XML 解析器以禁用外部实体解析

c# - 绑定(bind)到相关(详细)集合中第一项的属性

c# - 最好的 Nunit 测试运行器是什么?

unit-testing - 我应该为所有内容编写单元测试吗?

c# - 有没有办法使用 MEF 指定导入的元数据?

javascript - 如何使用 Jasmine 在 AngularJS 中为数组函数创建单元测试

android - 更新 Robolectric 2.4 : Getting application tag error for library projects in eclipse

python - 模拟 subprocess.Popen

ruby - 在 RSpec Controller 规范中重构模拟