我正在使用 Moq - 但可以轻松切换到另一个模拟框架,如果需要。
我定义了一个接口:
public interface IBaseEngineManagerImp
{
void SetClientCallbackSender(IClientCallbackSender clientCallbackSender);
}
然后我用
模拟 IBaseEngineManagerImpmockEngineManagerImp = new Mock<IEngineManagerImp>();
EngineManager engineManager = new EngineManager(mockEngineManagerImp.Object);
engineManager 然后调用 SetClientCallbackSender 传入一个值。
如何从单元测试中获取传递给 SetClientCallbackSender 的值?
(我想在 clientCallbackSender 上调用一些方法作为测试的一部分)
答案 0 :(得分:4)
你可以在mock上使用.Callback方法来调用传递给SetClientCallbackSender方法的参数的任何函数:
mockEngineManagerImp.Setup(x => x.SetClientCallbackSender(It.IsAny<IClientCallbackSender>()))
.Callback((IClientCallbackSender c) => c.DoSomething());
答案 1 :(得分:1)
在rhino中,您使用WhenCalled
或GetArgumentsForCallsmadeOn
:
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
的问题是,它返回一个二维数组,每个调用一行,每个参数一列。因此,您必须确切知道被测单元的调用次数。