Task.WhenAll()上的异步在单元测试

时间:2018-01-24 15:06:17

标签: asp.net-core async-await

我正在测试一些在运行时正在运行的异步MVC .netcore代码,但是在单元测试期间遇到了ObjectDisposedexception。 背景:我有另一个类似于这个的方法,它执行单个异步操作,返回一个任务,并且在运行时也可以工作,当我对它进行单元测试时。 到目前为止,无论我如何重构这个我得到:'无法访问已处置的对象。对象名称:'System.Net.Http.StreamContent''在尝试单元测试时。

方法:

public async Task<IEnumerable<Foo>> GetFoos() {
var idList = GetFooIds();
var tasks = Enumerable.Range(0, idList.Count)
                  .Select(i => GetFooById(idList[i]));

var fooResults = await Task.WhenAll(tasks);

var foos = new HashSet<Foo>();
foos.UnionWith(fooResults.SelectMany(x => x));

return foos;
}

单元测试方法适用于单个异步任务,但不适用于此:

[TestMethod]
public void CanGetFoos() {
    ...
    var result = service.GetFoos().Result;
    Assert.AreEqual(2, result.Count());
}

我怀疑内在的方法是一个因素,但它是:

private async Task<List<Foo>> GetFooById(string id)
{
    var nextPageExists = true;
    var fooList = new List<Foo>();
    var pageNumber = 1;
    while (nextPageExists)
    using (var response =
        await Client.GetAsync(GetFooUri(id, pageNumber++))
    {
        var content = await response.Content.ReadAsStringAsync();

        var fooResponse =
            JsonConvert.DeserializeObject<Foo>(content);
        fooList.AddRange(fooResponse.Objects);
        if (!Convert.ToBoolean(fooList.More))
            nextPageExists = false;
    })

    return fooList;
}

0 个答案:

没有答案