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<
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
////////
}