.net core Automapper ProjectTo不使用内存中的EFCore数据库(单元测试)

.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

我们使用Automappers ProjectTo方法来构建DTO对象,该对象是较大数据库视图的子集。当运行实际的应用程序时,它可以像预期的那样工作,但是我们遇到了一个问题,当使用内存数据库中的EF核心进行单元测试时,它不能给出预期的结果。不管查询是什么,它似乎只返回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();
}
下面是正在测试的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中是否有这样做的插件?我从您发布的链接中获得了表达式的调试视图字符串。我无法使用插件使其更易于阅读,但看着它,我认为它是按我所期望的方式配置的,正如我所说,它在生产中按预期工作,只有单元测试不起作用。下面是生成的表达式:调试视图无法帮助您执行查询。无论如何,最有可能的结果是,提供商处理它的方式不同。对此您无能为力。您如何检查/知道带有投影的查询不会返回任何结果?