首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟IAsyncEnumerable?

如何模拟IAsyncEnumerable?
EN

Stack Overflow用户
提问于 2019-11-27 14:06:18
回答 4查看 16.8K关注 0票数 40

我想对一个方法进行单元测试,该方法调用返回IAsyncEnumerable<T>的服务的另一个方法。我已经为我的服务Mock<MyService>创建了一个模拟,我想要setUp这个模拟,但我不知道如何做到这一点。有可能吗?是否有其他方法来测试一个方法,该方法调用了一个重新调整IAsyncEnumerable的东西?

代码语言:javascript
复制
public async Task<List<String>> MyMethodIWantToTest()
{
  var results = new List<string>();
  await foreach(var item in _myService.CallSomethingReturningAsyncStream())
  {
    results.Add(item);
  }
  return results;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-27 14:23:23

如果您不想做任何特殊的事情,例如延迟返回(通常是异步枚举的点),那么您可以只创建一个生成器函数来为您返回值。

代码语言:javascript
复制
public static async IAsyncEnumerable<string> GetTestValues()
{
    yield return "foo";
    yield return "bar";

    await Task.CompletedTask; // to make the compiler warning go away
}

这样,您就可以为您的服务创建一个模拟并测试您的对象:

代码语言:javascript
复制
var serviceMock = new Mock<IMyService>();
serviceMock.Setup(s => s.CallSomethingReturningAsyncStream()).Returns(GetTestValues);

var thing = new Thing(serviceMock.Object);
var result = await thing.MyMethodIWantToTest();
Assert.Equal("foo", result[0]);
Assert.Equal("bar", result[1]);

当然,由于您现在使用的是生成器函数,您还可以使这个过程变得更加复杂,并添加实际的延迟,甚至还可以包括一些机制来控制产量。

票数 39
EN

Stack Overflow用户

发布于 2019-11-27 14:19:33

我建议使用来自System.Linq.AsyncSystem.Linq.Async,正如Jeroen所建议的那样。看起来您使用的是Moq,因此看起来如下:

代码语言:javascript
复制
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`
}
票数 57
EN

Stack Overflow用户

发布于 2019-11-27 14:11:46

这取决于您使用的是哪个模拟框架。但是,使用Moq这样的例子可能很简单

代码语言:javascript
复制
var data = new [] {1,2,3,4};
var mockSvc = new Mock<MyService>();
mockSvc.Setup(obj => obj.CallSomethingReturningAsyncStream()).Returns(data.ToAsyncEnumerable());
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59071994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档