模拟方法的执行时间和顺序

鞘脂蛋白

我正在使用Moq和方法接口配对。我需要测试此接口中的方法是否按特定顺序执行,并且每个操作均执行特定次数。

界面

public interface IInterface
{
    void MethodOne(string foo);
    void MethodTwo(string foo);
}

方法

// MyClass stuff ...

public async Task Run()
{
    MethodOne("foo");
    MethodTwo("foo");
}

// ...

测验

我编写了此测试,以验证方法仅执行一定次数(一次):

[TestMethod]
public async Task Test()
{
    var mock = new Mock<IInterface>();
    var mockSequence = new MockSequence();

    var obj = new MyClass();
    await obj.Run();

    mock.Verify(i=> i.MethodOne("foo"), Times.Once());
    mock.Verify(i=> i.MethodTwo("foo"), Times.Once());
}

这很好用...

我已经尝试过这些测试,以确定是否可以正确满足特定的顺序,但是该测试似乎总是可以通过。

[TestMethod]
public async Task Test()
{
    var mock = new Mock<IInterface>();
    var mockSequence = new MockSequence();

    var obj = new MyClass();
    await obj.Run();

    mock.InSequence(mockSequence).Setup(i => i.MethodOne("foo"));
    mock.InSequence(mockSequence).Setup(i => i.MethodTwo("foo"));
}

应该通过,并且确实...

[TestMethod]
public async Task Test()
{
    var mock = new Mock<IInterface>();
    var mockSequence = new MockSequence();

    var obj = new MyClass();
    await obj.Run();

    mock.InSequence(mockSequence).Setup(i => i.MethodTwo("foo")); // swapped order here
    mock.InSequence(mockSequence).Setup(i => i.MethodOne("foo"));
}

不应该通过,但是可以...

  1. 我需要做些什么来验证是否满足正确的顺序?
  2. 如何将两者结合起来,以便可以测试执行次数和正确的顺序?
丹尼尔·斯莱特

这可能比您想讲的要离主题更远,但是NSubstitute是一个很好的模拟库,可以很好地处理此问题。在NSubstitute中,它只是:

  var mock = Substitute.For<IInterface>();
  var obj = new MyClass();
  await obj.Run();

  Received.InOrder(() => {
    mock.MethodOne("foo");
    mock.MethodTwo("foo");
    });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章