c# – 模拟方法执行时间和顺序

前端之家收集整理的这篇文章主要介绍了c# – 模拟方法执行时间和顺序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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"));
}

不应该通过,但确实……

>我需要做些什么来验证是否符合正确的顺序?
>我如何将两者结合起来,以便我可以测试执行次数和正确的顺序?

解决方法

这可能是你想要去的主题,但 NSubstitute是一个很好的模拟库,可以很好地处理这个问题.
在NSubstitute它只是:
var mock = Substitute.For<IInterface>();
  var obj = new MyClass();
  await obj.Run();

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

猜你在找的C#相关文章