如何在我的模拟(Moq或Rhino Mocks)界面上找到传递给方法的值?

时间:2009-11-26 09:29:51

标签: .net unit-testing mocking moq

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

我定义了一个接口:

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

然后我用

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

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

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

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

2 个答案:

答案 0 :(得分:4)

你可以在mock上使用.Callback方法来调用传递给SetClientCallbackSender方法的参数的任何函数:

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

答案 1 :(得分:1)

在rhino中,您使用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的问题是,它返回一个二维数组,每个调用一行,每个参数一列。因此,您必须确切知道被测单元的调用次数。