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

Nat*_*nar 5 xunit automapper .net-core

我们使用 Automappers ProjectTo 方法来构建 DTO 对象,该对象是较大数据库视图的子集。它在运行实际应用程序时按预期工作,但我们遇到了一个问题,即在使用 EF Core 内存数据库进行单元测试时它没有给出预期结果。无论查询什么,它似乎都只返回 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);
}
Run Code Online (Sandbox Code Playgroud)

这是种子数据:

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();
}
Run Code Online (Sandbox Code Playgroud)

这是正在测试的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

所以最后一个问题是为什么上面的“var test =”行可以工作,但是下面的“var results =”行与 ProjectTo 只是不断返回 0 结果?

Edg*_*ras 0

我也遇到过这个。

您的问题很可能是在ReportDtoMapperProfile课堂上(您没有向我们展示这一点)我假设您的自动映射器配置文件正在将该表链接到此属性的子表:AdHocDataSourceId = 1

由于您忘记为AdHockDataSource表设置种子,因此自动映射器不会返回映射结果。