这是基于Moq QuickStart示例在每次调用时返回不同值的一种方法。
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() =>
{
calls++;
if (calls == 1)
{
throw new InvalidOperationException("foo");
}
});
try
{
Console.WriteLine(mock.Object.GetCountThing());
}
catch (InvalidOperationException)
{
Console.WriteLine("Got exception");
}
Console.WriteLine(mock.Object.GetCountThing());
如果该方法返回void,用途:
var myMock = new Mock<IFoo>();
bool firstTimeExecuteCalled = true;
myMock.Setup(m => m.Execute())
.Callback(() =>
{
if (firstTimeExecuteCalled)
{
firstTimeExecuteCalled = false;
throw new SpecificException();
}
});
try
{
myMock.Object.Execute();
}
catch (SpecificException)
{
// Would really want to call Assert.Throws instead of try..catch.
Console.WriteLine("Got exception");
}
myMock.Object.Execute();
Console.WriteLine("OK!");
这看起来很有趣,但是,如果该方法是无效的,并且在安装后没有得到“返回”方法呢?实际上,如果“GetCountThing”返回一个int,它就会工作,如果它返回其他东西,它将不会编译。 –
@SergioRomero - 请参阅编辑答案。 – TrueWill
至于如果它不是一个int,请改变你从'Returns'行返回的内容。它不一定是'calls'的价值。 – TrueWill