c# - 顺序验证

标签 c# unit-testing moq

我正在尝试按顺序验证一组方法调用。

这是我想做的一个示例。这个测试应该失败,但它实际上通过了:

    public interface IMyInterface
    {
        void Method(int i);
    }

    public class MyClass : IMyInterface
    {
        public void Method(int i)
        {
        }
    }

    [TestMethod]
    public void MyTestMethod()
    {
        var mock = new Mock<IMyInterface>();

        var listOfThings = new List<int> { 5, 4, 3, 2, 1 };

        MethodUnderTest(mock.Object, listOfThings);

        mock.Verify(m => m.Method(1));
        mock.Verify(m => m.Method(2));
        mock.Verify(m => m.Method(3));
        mock.Verify(m => m.Method(4));
        mock.Verify(m => m.Method(5));
    }

    public void MethodUnderTest(IMyInterface myInterface, List<int> things)
    {
        foreach (var i in things)
        {
            myInterface.Method(i);
        }
    }

这应该会失败,因为 Verify 调用需要不同的参数顺序。

我试过这样的 MockSequence:

    [TestMethod]
    public void MyTestMethod()
    {
        var mock = new Mock<IMyInterface>();

        var listOfThings = new List<int> { 5, 4, 3, 2, 1 };

        var s = new MockSequence();

        mock.InSequence(s).Setup(m => m.Method(1));
        mock.InSequence(s).Setup(m => m.Method(2));
        mock.InSequence(s).Setup(m => m.Method(3));
        mock.InSequence(s).Setup(m => m.Method(4));
        mock.InSequence(s).Setup(m => m.Method(5));

        MethodUnderTest(mock.Object, listOfThings);

        mock.Verify(m => m.Method(1));
        mock.Verify(m => m.Method(2));
        mock.Verify(m => m.Method(3));
        mock.Verify(m => m.Method(4));
        mock.Verify(m => m.Method(5));
    }

但我想我做错了。

使用 MockBehaviour.Strict 似乎也不起作用:

    [TestMethod]
    public void MyTestMethod()
    {
        var mock = new Mock<IMyInterface>(MockBehavior.Strict);

        var listOfThings = new List<int> { 5, 4, 3, 2, 1 };

        mock.Setup(m => m.Method(1));
        mock.Setup(m => m.Method(2));
        mock.Setup(m => m.Method(3));
        mock.Setup(m => m.Method(4));
        mock.Setup(m => m.Method(5));

        MethodUnderTest(mock.Object, listOfThings);

        mock.Verify(m => m.Method(1));
        mock.Verify(m => m.Method(2));
        mock.Verify(m => m.Method(3));
        mock.Verify(m => m.Method(4));
        mock.Verify(m => m.Method(5));
    }

我不能使用 Setup 来配置传递给模拟调用的参数,因为这些值不是来自可模拟的源。

最佳答案

使用 MockBehavior.Strict 创建模拟

var mock = new Mock<IMyInterface>(MockBehavior.Strict);

将允许您验证调用是否按顺序进行。 完整的方法看起来像

[TestMethod]
public void MyTestMethod()
{
    var mock = new Mock<IMyInterface>(MockBehavior.Strict);

    //will fail
    var listOfThings = new List<int> { 5, 4, 3, 2, 1 };

    //will pass
    var listOfOtherThings = new List<int> { 1, 2, 3, 4, 5 };

    var s = new MockSequence();

    mock.InSequence(s).Setup(m => m.Method(1));
    mock.InSequence(s).Setup(m => m.Method(2));
    mock.InSequence(s).Setup(m => m.Method(3));
    mock.InSequence(s).Setup(m => m.Method(4));
    mock.InSequence(s).Setup(m => m.Method(5));

    MethodUnderTest(mock.Object, listOfThings);

    mock.Verify(m => m.Method(1));
    mock.Verify(m => m.Method(2));
    mock.Verify(m => m.Method(3));
    mock.Verify(m => m.Method(4));
    mock.Verify(m => m.Method(5));
}

关于c# - 顺序验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700786/

相关文章:

c# - 使用 WCF 的 Windows 服务设计

c# - 从 C# 应用程序运行多个命令

javascript - 来自 ajax 的模型绑定(bind),用于将日期值传递为 null

javascript - Jest 将 MomentJS 导入到未弹出的 React 应用程序中

python - 使用 python/django 关闭套接字并避免 Errno 10054 的正确方法是什么

c# - 记录多实例应用程序最佳实践?

c# - 为 gRPC 客户端创建接口(interface)以进行单元测试

c# - 起订量错误 : "Expected invocation on the mock at least once, but was never performed"

c# - 使用最小起订量验证自身调用了哪个方法?

javascript - Jasmine 是否有类似最小起订量的 It.IsAny?