我有一种类似于以下的方法:
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。如何实现它的任何指示/想法/想法将非常有帮助。
答案 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);
}