首页 > 解决方案 > 你如何模拟 IAsyncEnumerable?

问题描述

我想对一个调用另一个服务方法的方法进行单元测试,该方法返回一个IAsyncEnumerable<T>. 我已经为我的服务创建了一个模拟,Mock<MyService>我想设置这个模拟,但我不知道该怎么做。可能吗 ?是否有其他方法可以对调用重新调整的方法的方法进行单元测试IAsyncEnumerable

public async Task<List<String>> MyMethodIWantToTest()
{
  var results = new List<string>();
  await foreach(var item in _myService.CallSomethingReturningAsyncStream())
  {
    results.Add(item);
  }
  return results;
}

标签: c#unit-testingasp.net-coreiasyncenumerable

解决方案


正如 Jeroen 建议的那样,我建议使用ToAsyncEnumerablefrom 。System.Linq.Async看起来你正在使用 Moq,所以这看起来像:

async Task MyTest()
{
  var mock = new Mock<MyService>();
  var mockData = new[] { "first", "second" };
  mock.Setup(x => x.CallSomethingReturningAsyncStream()).Returns(mockData.ToAsyncEnumerable());

  var sut = new SystemUnderTest(mock.Object);
  var result = await sut.MyMethodIWantToTest();

  // TODO: verify `result`
}

推荐阅读