首页 > 解决方案 > NSubstitute 中多次调用的不同返回值

问题描述

我模拟了一个迭代器并将其设置为返回多个值。第一次调用它应该返回 true,第二次调用它应该返回 false。

我以此作为参考:https ://nsubstitute.github.io/help/multiple-returns/

var iterator = Substitute.For<FeedIterator<Product>>();
iterator.HasMoreResults.Returns(true, false);

但是当我运行测试时,返回值总是假的。如果我切换参数返回值始终为真。

看起来这个序列不起作用,或者我错过了什么?

根据要求进行测试:

[Fact]
public async void GetAll_ReturnsProducts()
{
    //arrange
    var product = new Product();
    var container = Substitute.For<Container>();
    var cosmosLinqQuery = Substitute.For<ICosmosLinqQuery>();
    var iterator = Substitute.For<FeedIterator<Product>>();
    var feedResponse = Substitute.For<FeedResponse<Product>>();
    //var enumerator = Substitute.For<IEnumerator<Product>>();

    cosmosLinqQuery.GetFeedIterator<Product>(default).ReturnsForAnyArgs(iterator);
    container.GetItemLinqQueryable<Product>().Returns(new List<Product>().AsQueryable());
    IProductRepository productRepository = new ProductRepository(container, cosmosLinqQuery);            
    iterator.HasMoreResults.Returns(false, false, true);

    //feedResponse.GetEnumerator().Returns(enumerator);
    iterator.ReadNextAsync().Returns(feedResponse);

    //act
    var products = await productRepository.GetAll();

    //assert
    Assert.Same(product, products.First());
}

以及被测试的方法:

async Task<IList<Product>> IProductRepository.GetAll()
{
    var query = (from p in container.GetItemLinqQueryable<Product>()
                    select p);
    var iterator = cosmosLinqQuery.GetFeedIterator(query);

    var products = new List<Product>();

    while(iterator.HasMoreResults)
    {
        foreach(var item in await iterator.ReadNextAsync())
        {
            products.Add(item);
        }
    }
    return products;
}

标签: c#unit-testingnsubstitute

解决方案


推荐阅读