从方法NSubstitute

时间:2019-10-17 23:59:11

标签: c# nsubstitute

我阅读了文档,您可以使用Configure()来在每次调用方法时返回不同的值。但是,我正在使用NSubstitute 4.2.1,并且无法访问API上的“ Configure()”。我想知道是否有任何变通办法来返回不同的值。

到目前为止,我已经尝试过以下操作:

var output = new List<List<MobileGetDocumentAuthorizationDto>>();
var counter = 0;
apiLayer.GetByIds(idStack).ReturnsForAnyArgs(x => 
                    {return output[counter++]; 
                    });

我将新值添加到循环中。

每次调用apiLayer.GetByIds()时,我想返回不同的列表。

感谢您在此方面的专业知识。

1 个答案:

答案 0 :(得分:1)

这可以通过许多不同的方式完成,但是下面是使用以下类型的简单示例

public interface IService {
    List<MyDto> GetByIds(int[] ids);
}

public class MyDto {
    public int Id { get; set; }
}

样本测试显示了如何使用Returns函数生成随机结果。

[TestClass]
public class NSubTests {
    [TestMethod]
    public void Should_Return_Multiple_ListValues() {
        //Arrange
        IService apiLayer = NSubstitute.Substitute.For<IService>();
        Random randomIds = new Random(9999);
        Random randomCount = new Random();

        apiLayer.GetByIds(Arg.Any<int[]>()).Returns(args => {
            var ids = args.ArgAt<int[]>(0);

            var count = randomCount.Next(ids.Length);

            var items = Enumerable.Range(0, count)
                .Select(_ => new MyDto { Id = randomIds.Next() })
                .ToList();

            return items;
        });

        //Act
        var list1 = apiLayer.GetByIds(new[] { 1, 2, 3, 4, 5 });
        var list2 = apiLayer.GetByIds(new[] { 1, 2, 3, 4, 5 });

        //Assert - FluentAssertions
        list1.Should().NotBeSameAs(list2);
    }
}

每次调用模拟成员时,它将返回一个不同的列表,该列表基于作为输入传递的id的数量生成。