【问题标题】:Moq equivalent to Rhino Mock's GetArgumentsForCallsMadeOn起订量相当于 Rhino Mock 的 GetArgumentsForCallsMadeOn
【发布时间】:2011-05-06 15:26:23
【问题描述】:

试图检查和论证并需要检索它。起订量是多少?或者在最小起订量中做到这一点的方法?

【问题讨论】:

    标签: moq rhino-mocks


    【解决方案1】:

    想通了,利用模拟设置上的回调功能

    int captured_int;
    
    mocked_obj.Setup(x => x.SomeMethod(It.IsAny<int>()))
        .Callback<int>(x => captured_int = x);
    

    如果你的方法有多个参数

    int captured_int;
    object captured_object;
    
    mocked_obj.Setup(x => x.SomeMethod(It.IsAny<int>(), It.IsAny<object>()))
        .Callback<int, object>((i, o) => {
                                             captured_int = i;
                                             captured_object = o;
                                         });
    

    然后您可以对捕获的值进行断言;

    【讨论】:

    【解决方案2】:

    从 Moq 4.9.0 开始,您可以访问模拟对象的调用列表并对那些调用进行断言,而无需回调:

    [Test]
    public void TestMoq()
    {
        var someClass = new Mock<ISomeClass>();
    
        someClass.Object.SomeMethod(42, null);
        someClass.Object.SomeMethod(88, "Hello");
    
        // First invocation
        Assert.AreEqual(42, (int) someClass.Invocations[0].Arguments[0]);
        Assert.IsNull(someClass.Invocations[0].Arguments[1]);
    
        // Second invocation
        Assert.AreEqual(88, (int) someClass.Invocations[1].Arguments[0]);
        Assert.AreEqual("Hello", someClass.Invocations[1].Arguments[1]);
    }
    

    当然这只是一个示例,在现实世界的代码中,您必须更加小心使用此方法,主要是因为所有参数都可以作为 objects 访问,而不是像 Callback 中的类型化参数。此外,这些调用不与 Setup 绑定,它是对模拟类的所有调用的列表。

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多