How do you mock an IAsyncEnumerable?

后端 未结 4 1151
时光取名叫无心
时光取名叫无心 2020-12-20 13:23

I want to unit test a method that calls another method of a service returning an IAsyncEnumerable. I have created a a mock of my service Mock<

4条回答
  •  天涯浪人
    2020-12-20 14:01

    One way of solving this is to use dedicated test classes that wrap an IEnumerable that is enumerated synchronously.

    TestAsyncEnumerable.cs

    internal class TestAsyncEnumerable : List, IAsyncEnumerable
    {
       public TestAsyncEnumerable(IEnumerable enumerable) : base(enumerable) { }
    
       public IAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) => new TestAsyncEnumerator(GetEnumerator());
    }
    
    internal class TestAsyncEnumerator : IAsyncEnumerator
    {
       private readonly IEnumerator _inner;
    
       public TestAsyncEnumerator(IEnumerator inner)
       {
          _inner = inner;
       }
    
       public ValueTask MoveNextAsync() => new ValueTask(_inner.MoveNext());
    
       public T Current => _inner.Current;
    
       public ValueTask DisposeAsync()
       {
          _inner.Dispose();
    
          return new ValueTask(Task.CompletedTask);
       }
    }
    

    Usage:

    [Fact]
    public async Task MyTest() {
       var myItemRepository = A.Fake();
    
       A.CallTo(       () => myRepository.GetAll())
        .ReturnsLazily(() => new TestAsyncEnumerable(new List { new MyItem(), ... }));
    
    
       //////////////////
       /// ACT & ASSERT
       ////////
    }
    

提交回复
热议问题