.net core Automapper ProjectTo不使用内存中的EFCore数据库(单元测试)
我们使用Automappers ProjectTo方法来构建DTO对象,该对象是较大数据库视图的子集。当运行实际的应用程序时,它可以像预期的那样工作,但是我们遇到了一个问题,当使用内存数据库中的EF核心进行单元测试时,它不能给出预期的结果。不管查询是什么,它似乎只返回0个结果。这是我正在尝试运行的测试.net core Automapper ProjectTo不使用内存中的EFCore数据库(单元测试),.net-core,automapper,xunit,.net Core,Automapper,Xunit,我们使用Automappers ProjectTo方法来构建DTO对象,该对象是较大数据库视图的子集。当运行实际的应用程序时,它可以像预期的那样工作,但是我们遇到了一个问题,当使用内存数据库中的EF核心进行单元测试时,它不能给出预期的结果。不管查询是什么,它似乎只返回0个结果。这是我正在尝试运行的测试 [Fact] public async Task GetTemplateAdHocReportList_ReturnsOnlyTemplateReports() { await TestH
[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();
}
下面是正在测试的GetTemplateAdhorReports方法
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异步任务getTemplateAdhorReports()
{
//这在单元测试中给出了预期的1个对象:
var test=await_reportContext.AdHocReports.Where(x=>x.Status&&x.IsTemplate).OrderBy(x=>x.Name.ToListAsync();
//即使种子数据应该返回1个结果,它也总是返回计数为0的结果
var results=await_reportContext.AdHocReports.Where(x=>x.Status&&x.IsTemplate).OrderBy(x=>x.Name).ProjectTo(_-mapper.ConfigurationProvider).toListSync();
返回结果;
}
最后,如果它们有用,这里有构造函数:
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;
}
公共AdHocServiceTests()
{
TestHelper=新的TestHelper();
var reportOptions=TestHelper.GetMockedReportDbOptions();
ReportContext=新的ReportContext(reportOptions);
_sut=新的AdHocService(ReportContext,TestHelper.Mapper,TestHelper.GetMockedNiceService().Object);
}
公共TestHelper()
{
var mappingConfig=新的MapperConfiguration(cfg=>
{
AddProfile();
});
Mapper=mappingConfig.CreateMapper();//TestHelper上的公共属性
}
公共AdHocService(ReportContext ReportContext、IMapper映射器、INiceService)
{
_niceService=niceService;
_映射器=映射器;
_reportContext=reportContext;
}
最后一个问题是,为什么上面的“var test=”行可以工作,但是下面的“var results=”行与ProjectTo一起只会不断返回0个结果?检查。VSCode中是否有这样做的插件?我从您发布的链接中获得了表达式的调试视图字符串。我无法使用插件使其更易于阅读,但看着它,我认为它是按我所期望的方式配置的,正如我所说,它在生产中按预期工作,只有单元测试不起作用。下面是生成的表达式:调试视图无法帮助您执行查询。无论如何,最有可能的结果是,提供商处理它的方式不同。对此您无能为力。您如何检查/知道带有投影的查询不会返回任何结果?