每次调用时更改行为的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的行为,使其抛出异常?

每次调用时更改行为的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