如何在另一个方法调用中设置一个方法调用以返回不同的结果

时间:2018-10-23 17:20:56

标签: c# unit-testing moq

我有一种类似于以下的方法:

public List<Item> MethodA() {
    List<Things> result1 = MethodB(param1);
    if(result1==null)
        //Do Something

    List<Things> result2 = MethodB(param2);

    //Do Something 
}

我尝试使用Moq来模拟此方法,以进行以下单元测试:

//Mocking the call to MethodB to return null the second time it's called
mockService.SetupSequence(x=>x.MethodB(It.IsAny<List<Things>>()))
.Returns(GetList())
.Returns(null);

//Call to method A to run the test
MethodA();

但是,这似乎不起作用,在模拟之后,我仅得到列表作为MethodB的返回结果。但是,我希望列表在第一个调用中返回,而在第二个调用中返回null。如何实现它的任何指示/想法/想法将非常有帮助。

2 个答案:

答案 0 :(得分:1)

如果要在同一测试类上模拟事物,请确保在要实际运行的方法上使用CallBase(),否则该模拟将不会运行代码。

&.active

当我尝试将MethodA设置为CallBase来运行示例时,我得到了预期的结果。

答案 1 :(得分:0)

尝试摆脱第二个.Returns(null)调用,默认情况下,如果未指定序列,则返回null。

工作示例:

public class UnitTest
{
    [Fact]
    public void Test1()
    {
        var serviceMock = new Mock<IService>();
        serviceMock.SetupSequence(s => s.MethodB(It.IsAny<List<object>>()))
            .Returns(new List<int>());

        var service = serviceMock.Object;
        Assert.NotNull(service.MethodB(new List<object>()));
        Assert.Null(service.MethodB(new List<object>()));
    }
}

public interface IService
{
    List<int> MethodB(List<object> objects);
}