用于更改每次调用行为的 Moq 语法是什么?

Blu*_*rin 1 c# tdd moq

我需要一个接口在第一次传递参数时返回某个值,但为每个后续调用抛出异常。

我怎样才能做到这一点 ?

即如果我有这样的接口:

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 的行为,以便它抛出异常?

Luc*_*ski 6

如果您确实需要模拟抛出,这应该有效:

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 的答案更好。