【发布时间】:2021-01-02 07:40:01
【问题描述】:
我有一行代码在单元测试中失败,但在开发和生产中运行良好。
var result = await _mapper.ProjectTo<GetApplicationsResponse.Application>(pipelineContext.Query).ToListAsync(cancellationToken);
pipelineContext.Query 是 IQueryable 的类型。
我正在尝试进行的测试如下
[Fact]
public async Task Handle_Success_Returns_GetApplicationsResponse()
{
//Arrange
var sut = CreateSut();
_pipelineSteps
.Setup(steps => steps.GetEnumerator())
.Returns(() => new List<IPipelineStep<GetApplicationsContext>>
{
Mock.Of<IPipelineStep<GetApplicationsContext>>()
}.GetEnumerator());
_mapper.Setup(x => x.ConfigurationProvider)
.Returns(
() => new MapperConfiguration(
cfg =>
{
cfg.CreateMap<Entities.ApplicationsAggregate.Application, GetApplicationsResponse.Application>();
cfg.CreateMap<Entities.ApplicationsAggregate.SiteLocation, GetApplicationsResponse.SiteLocation>();
cfg.CreateMap<Entities.ApplicationsAggregate.SiteAddress, GetApplicationsResponse.SiteAddress>();
}));
//Act
var result = await sut.Handle(new GetApplicationsRequest(), default);
//Assert
result.Should().BeOfType<GetApplicationsResponse>();
_pipelineSteps.Verify(steps => steps.GetEnumerator(), Times.Once);
}
我在这方面的限制是我无法从_projectTo<...> 更改,因为这是新的工作方法\标准。
所以,如果能够通过此错误,我将不胜感激
System.InvalidOperationException:源 IQueryable 未实现 IAsyncEnumerable
。只有实现 IAsyncEnumerable 的源才能用于实体框架异步操作。
---- 编辑 ---
之前忘了提到测试使用的是内存数据库
【问题讨论】:
-
哪一行代码会抛出这个
InvalidOperationException? -
@PeterCsala 在测试 sut.Handle 中,在代码中我在顶部引用的行
-
可能是
ToListAsync电话。解决方案是确保您的映射器返回一个 IAsyncEnumerable 序列。可能还需要提供者的 AsyncQueryProvider 。您可以自己动手来执行此操作(实现 IAsyncEnumerable),或使用为您执行此操作的现有库。周围有几个,我维护 EntityFramework.Testing.Moq 应该这样做。 -
@rgvlee 你能举例说明我将如何在测试中实施你的解决方案吗
标签: c# unit-testing automapper moq .net-core-3.1