首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何独立于模拟框架使用Machine.Fakes模拟“out”参数?

如何独立于模拟框架使用Machine.Fakes模拟“out”参数?
EN

Stack Overflow用户
提问于 2012-01-04 00:03:22
回答 3查看 1.9K关注 0票数 2

我和Machine.Fakes陷入了僵局。我不知道如何仅使用out设备来模拟Machine.Fakes参数。由于a bug在RhinoMocks中,我把mfake适配器切换到FakeItEasy。据我所知,任何适配器都应该是可互换的。

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

代码语言:javascript
复制
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>参数设置的相同值,但这导致了我的测试失败--似乎没有传递这个值!Arg<T>确实有了解决方案,但我不能再使用它了,因为它是Rhino.Mocks的一部分。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-02 11:37:09

因为1.7.0版Machine.Fakes支持在假调用中设置outref参数--当使用FakeItEasy或NSubstitute适配器时。因此,您不必再直接使用FakeItEasy了。Alex的示例可以简化如下:

代码语言:javascript
复制
using Machine.Fakes;
using Machine.Specifications;

namespace MSpecMFakesOutParam
{
    public interface IFoo
    {
        void Foo(out int foo);
    }

    public class When_using_FakeItEasy_with_out_params : WithFakes
    {
        static int Out;

        Establish context = () =>
        {
            int ignored;
            The<IFoo>().WhenToldTo(x => x.Foo(out ignored)).AssignOutAndRefParameters(42);
        };

        Because of = () => The<IFoo>().Foo(out Out);

        It should_assign_the_out_param = () => Out.ShouldEqual(42);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-01-04 20:28:24

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

我个人不使用out参数,而且(如果我真的需要返回多个返回值),可以使用元组(Tuple)或自定义类来处理此类场景。这就是为什么我从来没有把它放在第一位。

我还没有研究过它,但是在Machine.Fakes中实现ref和out参数可能是不可行的。在多个模拟框架的基础上实现包装器的挑战之一是,为了成功,所有的模拟框架都需要在它们的工作方式上有一个共同点。Machine.Fakes现在也不支持嘲弄事件,因为我无法找到所有这些事件的共同分母(只有两个NSub妓女/FakeItEasy/Moq)。

在我看来,你目前有两种选择:

如果您控制我们正在讨论的接口,您可以通过一个元组或自定义类来绕过这个问题。如果您不拥有这个接口,您可以按照亚历山大·格罗斯的建议,随时恢复到底层的模拟框架。

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

  • Bjoern
票数 7
EN

Stack Overflow用户

发布于 2012-01-04 13:14:03

在这种情况下,您需要直接使用FakeItEasy。我认为问题在于FakeItEasy如何通过在假对象调用规范中附加AssignsOutAndRefParameters来设置out参数。不过,这不应该是个问题,因为Machine.Fakes所做的一切都是将WhenToldTo等转换为所使用的伪造框架的适当API。

代码语言:javascript
复制
using FakeItEasy;

using Machine.Fakes;
using Machine.Specifications;

namespace MSpecMFakesOutParam
{
  public interface IFoo
  {
    void Foo(out int foo);
  }

  public class When_using_FakeItEasy_with_out_params : WithFakes
  {
    static IFoo Foo;
    static int Out;

    Establish context = () =>
    {
      Foo = An<IFoo>();

      var ignored = A<int>.Ignored;
      A.CallTo(() => Foo.Foo(out ignored)).AssignsOutAndRefParameters(42);
    };

    Because of = () => Foo.Foo(out Out);

    It should_assign_the_out_param =
      () => Out.ShouldEqual(42);
  }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8720423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档