【问题标题】:How to find the value that has been passed to a method on my mocked (Moq or Rhino Mocks) interface?如何在我的模拟(Moq 或 Rhino Mocks)接口上找到已传递给方法的值?
【发布时间】:2009-11-26 09:29:50
【问题描述】:

我正在使用 Moq - 但可以轻松切换到另一个模拟框架如果需要

我定义了一个接口:

public interface IBaseEngineManagerImp
{
   void SetClientCallbackSender(IClientCallbackSender clientCallbackSender);
}

然后我用

模拟 IBaseEngineManagerImp
mockEngineManagerImp = new Mock<IEngineManagerImp>();
EngineManager engineManager = new EngineManager(mockEngineManagerImp.Object);

engineManager 然后调用 SetClientCallbackSender 传入一个值。

如何从我的单元测试中获取传递给 SetClientCallbackSender 的值?

(我希望在 clientCallbackSender 上调用一些方法作为测试的一部分)

【问题讨论】:

    标签: .net unit-testing mocking moq


    【解决方案1】:

    您可以在 mock 上使用 .Callback 方法,对传入 SetClientCallbackSender 方法的参数调用任何函数:

    mockEngineManagerImp.Setup(x => x.SetClientCallbackSender(It.IsAny<IClientCallbackSender>()))
                .Callback((IClientCallbackSender c) => c.DoSomething());
    

    【讨论】:

      【解决方案2】:

      在犀牛中,您使用WhenCalledGetArgumentsForCallsmadeOn

      Thingy argument;
      mock
        .Stub(x => x.SetClientCallbackSender(Arg<IClientCallbackSender>.Is.Anything))
        .WhenCalled(call => argument = (Thingy)call.Arguments[0]);
      // act
      //...
      // assert
      Assert.AreEqual(7, argument.X); 
      

      这个实现的问题是,你只能得到最新的参数。您可以通过使用参数约束(而不是 Is.Anything)来对此进行更多控制。

      // act
      //...
      // assert
      Thingy argument = 
        (Thingy)mock
          .GetArgumentsFormCalsMadeOn(x => x.SetClientCallbackSender(
            Arg<IClientCallbackSender>.Is.Anything))[0][0];
      

      GetArgumentsFormCalsMadeOn 的问题在于,它返回一个二维数组,每个调用对应一行,每个参数对应一个列。因此,您必须准确了解被测单元执行了多少次调用。

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多