每次调用时更改行为的Moq语法是什么
本文关键字:Moq 语法 是什么 调用 | 更新日期: 2023-09-27 18:26:25
我需要一个接口,以便在第一次传递参数时返回某个值,但在每次后续调用时都会引发异常。
我该怎么做?
即,如果我有这样一个接口:
namespace TradingInterface
{
public interface IBackOffice
{
void Buy(string stock, int amount);
void Sell(string stock, int amount);
}
}
和以下模拟对象:
public class MockBackOffice: IBackOffice
{
private bool _firstcall = true;
public void Buy(string stock, int amount)
{
if (_firstcall && stock == "AAPL")
{
_firstcall = false;
return;
}
else
{
throw new Exception("second call");
}
}
public void Sell(string stock, int amount)
{
return;
}
}
如果我定义以下内容,它不会在"AAPL"上进行第二次买入:
Mock<IBackOffice> mockBackOffice = new Mock<IBackOffice>();
mockBackOffice.Setup(x => x.Buy(It.IsAny<string>(), It.IsAny<int>()));
var backOffice = mockBackOffice.Object;
我如何在第二次调用时用某些参数更改Moq的行为,使其抛出异常?
如果你真的需要模拟投掷,这应该会起作用:
var firstCall = false;
mockBackOffice.Setup(x => x.Buy(It.IsAny<string>(), It.IsAny<int>()))
.Callback((string stock, int amount) => {
if (firstCall)
firstCall = false;
else
throw new InvalidOperationException("second call");
});
如果你只需要验证函数最多被调用一次,那么dwatland的答案会更好。
您希望在mockBackOffice上使用Verify方法。这样使用:
mockBackOffice.Verify(x => x.Buy("AAPL", It.IsAny<int>()), Times.AtMostOnce());
如果具有给定参数的lambda表达式中的方法没有执行指定次数,则单元测试失败。有关更多信息,请查看Moq文档下的"验证"部分:https://github.com/Moq/moq4/wiki/Quickstart