Automapper ProjectTo无法在内存数据库中使用EFCore(单元测试)



我们使用Automappers ProjectTo方法来构建一个DTO对象,该对象是较大数据库视图的子集。它在运行实际应用程序时按预期工作,但我们遇到了一个问题,在使用EF Core In Memory数据库进行单元测试时,它没有给出预期的结果。无论查询结果如何,它似乎都只返回0个结果。这是我尝试运行的测试。

[Fact]
public async Task GetTemplateAdHocReportList_ReturnsOnlyTemplateReports()
{
await TestHelper.SeedFull(ReportContext); // Calls SeedAdHocReports below along with other seed methods
var results = await _sut.GetTemplateAdHocReports();
results.Where(x => !x.IsTemplate).Count().Should().Be(0);
}

这是种子数据:

public static async Task SeedAdHocReports(ReportContext context)
{
var reports = new AdHocReport[]
{
new AdHocReport()
{
Id = 1,
Name = "DevExtreme Example Report",
IsTemplate = true,
AdHocDataSourceId = 1,
Fields = "[{"caption":"Category","dataField":"ProductCategoryName","expanded":true,"area":"row"},{"caption":"Subcategory","dataField":"ProductSubcategoryName","area":"row"},{"caption":"Product","dataField":"ProductName","area":"row"},{"caption":"Date","dataField":"DateKey","dataType":"date","area":"column"},{"caption":"Amount","dataField":"SalesAmount","summaryType":"sum","format":{"type":"currency","precision":2,"currency":"USD"},"area":"data"},{"caption":"Store","dataField":"StoreName"},{"caption":"Quantity","dataField":"SalesQuantity","summaryType":"sum"},{"caption":"Unit Price","dataField":"UnitPrice","format":"currency","summaryType":"sum"},{"dataField":"Id","visible":false}]",
Status = true
}
};
context.AdHocReports.AddRange(reports);
await context.SaveChangesAsync();
}

以下是正在测试的GetTemplateAdHocReports方法

public async Task<IList<AdHocReportDto>> GetTemplateAdHocReports()
{
//This gives the expected 1 object in the unit tests:
var test = await _reportContext.AdHocReports.Where(x => x.Status && x.IsTemplate).OrderBy(x => x.Name).ToListAsync();
//This always comes back with a count of 0 even though the seed data should return 1 result
var results = await _reportContext.AdHocReports.Where(x => x.Status && x.IsTemplate).OrderBy(x => x.Name).ProjectTo<AdHocReportDto>(_mapper.ConfigurationProvider).ToListAsync();
return results;
}

最后,如果它们有用,这里有构造函数:

public AdHocServiceTests()
{
TestHelper = new TestHelper();
var reportOptions = TestHelper.GetMockedReportDbOptions();
ReportContext = new ReportContext(reportOptions);
_sut = new AdHocService(ReportContext, TestHelper.Mapper, TestHelper.GetMockedNiceService().Object);
}
public TestHelper()
{
var mappingConfig = new MapperConfiguration(cfg =>
{
cfg.AddProfile<ReportDtoMapperProfile>();
});
Mapper = mappingConfig.CreateMapper(); // public property on TestHelper
}
public AdHocService(ReportContext reportContext, IMapper mapper, INiceService niceService)
{
_niceService = niceService;
_mapper = mapper;
_reportContext = reportContext;
}

最后一个问题是,为什么上面的"var test="行有效,而下面的"var results="行与ProjectTo却一直返回0个结果?

我也遇到过这种情况。

你的问题很可能出现在ReportDtoMapperProfile类中(你没有向我们展示(我假设您的自动映射器配置文件正在将表链接到此属性的子表:AdHocDataSourceId = 1

因为您忘记了为AdHockDataSource表设定种子,所以自动映射器不会返回映射的结果。

最新更新