【问题标题】:Return multiple list values from method NSubstitute从方法 NSubstitute 返回多个列表值
【发布时间】:2019-10-17 23:59:11
【问题描述】:

我在文档中读到,您可以使用 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() 时返回不同的列表。

感谢您分享这方面的专业知识。

【问题讨论】:

  • 如果您使用的是 NSubstitute 4.2.1,它应该包含 Configure()。不过,我认为您在这种情况下不需要它。 @Nkosi 的答案显示随机值,或者如果硬编码值没问题,您可以使用 multiple values 语法。

标签: c# nsubstitute


【解决方案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 数量生成的不同列表。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多