Automapper Project, чтобы не работать с EFCore в памяти базы данных (юнит-тесты) - PullRequest
1 голос
/ 24 марта 2020

Мы используем метод 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);
}

Это Seed Data:

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 результатов?

...