使用xUnit和Moq验证是否根据条件执行了方法

Gui*_*lle 4 c# moq xunit.net .net-core

使用xUnit和Moq检查是否根据另一个方法的返回值执行一个方法。例:

public class A 
{
    public bool M1() { // return true or false ... }
    public void M2() { // Do something ..... }
}

public class B 
{
    private A objectA;

    public B(A a)
    {
        objectA = a;
    }

    public void Mb ()
    {
        for(int i = 0; i <= 5; i++)
        {
            if (objectA.M1())
            {
                return;
            }

            objectA.M2();
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想验证这样的事情:

[Fact]
public void Test()
{
    // Arrange
    Mock<A> mockA = new Mock<A>();
    mockA.Setup(x => x.M1()).Return(true);
    mockA.Setup(x => x.M2());

    // Act
    B b = new B(mockA.object);
    b.Mb();

    // Assert
    mockA.Verify(m => m.M2(), """all exactly time that M1 returned false"""); // if this were possible it would be perfect
}
Run Code Online (Sandbox Code Playgroud)

是否可以用xUnit和Moq做类似的事情?

Ste*_*eve 6

您应该能够执行以下操作:

    [Fact]
    public void Test()
    {
        // Arrange
        Mock<A> mockA = new Mock<A>();
        int count = 0;
        mockA.Setup(x => x.M1()).Returns(true).Callback(() => { count++; });
        mockA.Setup(x => x.M2());

        // Act
        B b = new B(mockA.Object);
        b.Mb();

        // Assert
        mockA.Verify(m => m.M2(), Times.Exactly(count), "all exactly time that M1 returned false");
    }
Run Code Online (Sandbox Code Playgroud)