我需要一个接口在第一次传递参数时返回某个值,但为每个后续调用抛出异常。
我怎样才能做到这一点 ?
即如果我有这样的接口:
namespace TradingInterface
{
public interface IBackOffice
{
void Buy(string stock, int amount);
void Sell(string stock, int amount);
}
}
Run Code Online (Sandbox Code Playgroud)
以及以下模拟对象:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我定义以下内容,它不会引发“AAPL”上的第二次购买调用:
Mock<IBackOffice> mockBackOffice = new Mock<IBackOffice>();
mockBackOffice.Setup(x => x.Buy(It.IsAny<string>(), It.IsAny<int>()));
var backOffice = mockBackOffice.Object;
Run Code Online (Sandbox Code Playgroud)
如何使用某些参数更改第二次调用时 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");
});
Run Code Online (Sandbox Code Playgroud)
如果您需要的只是验证该函数最多被调用一次,那么 dwatland 的答案更好。