Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Verify with xUnit and Moq if a method was executed base on a condition

With xUnit and Moq check if a method is executed base on the return value of another method. Example:

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();
       }
    }
}

I want to verify something like this:

[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
}

Is it possible to do something like that with xUnit and Moq ??

like image 944
Guille Avatar asked Apr 05 '18 12:04

Guille


1 Answers

You should be able to do something like this:

    [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");
    }
like image 162
Steve Avatar answered Oct 14 '22 01:10

Steve