System.MissingMethodException - установщик в конструкторе - PullRequest
1 голос
/ 04 февраля 2020

У меня есть модульный тест, который вызывает хранилище с установщиком для идентификатора пользователя DataContext. При выполнении тестов я сталкиваюсь с System.MissingMethodException .

CrewRepository:

public CrewRepository(DataContext dataContext) : base(dataContext)
{
    dataContext.UserId = (int)UserCode.System;
}

APIFixture:

services.AddDbContext<CrewAdapter.DataContext>(options => options
    .UseInMemoryDatabase("CrewUnitTestingDatabase")
    .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning)));

services.AddScoped<CrewRepository>(x =>
{
    // This is line 42:
    return new CrewRepository(x.GetRequiredService<CrewAdapter.DataContext>()); 
});

CrewRepositoryTests:

public void RecordExists_SequenceNumberIsGreaterThanExistingRequest_MarkAsUpdate()
{
    using (var scope = _serviceProvider.CreateScope())
    {
        APIDataBuilder.PopulateContext(scope);

        var bookingRequest = new BookingRequest
        {
            CrewStaffNumber = "TEST",
            FirstName = "Test Paul",
            MiddleName = "",
            LastName = "Test George",
            Rank = "TEST",
            Appointment = "TEST"
        };

        // This is line 218:
        var result = scope.ServiceProvider.GetRequiredService<CrewRepository>()
            .CreateBookingRequest(bookingRequest); 

        Assert.Equal((int)BookingRequestStatus.Update, result.Status);
    }
}

DataContext:

public class DataContext : DbContext
{
    public int UserId { get; set; }
    public string ConnectionString { get; set; }

    // *bunch of entities*
}

Сообщение об ошибке:

[2/4/2020 8:16:50 AM Error] [xUnit. net 00: 00: 01.83] Crew.Tests.Api.Repositories.CrewRequestRepositoryTests.RecordExists_SequenceNumberIsGreaterThanExistingRequest_MarkAsUpdate [FAIL] [2/4/2020 8:16:50 AM, информационный] [00Unt. : Метод не найден: 'Void Crew.DataAdapter.DataContext.set_UserId (Int32)'. [4/4/2020 8:16:50 AM информационный] [xUnit. net 00: 00: 01.83] Трассировка стека: [2/4/2020 8:16:50 AM информационный] [xUnit. net 00 : 00: 01.83] at Repositories.CrewRepository..ctor (DataContext dataContext) [4/2/2020 8:16:50 AM Informational] [xUnit. net 00: 00: 01.83] C: \ Users \ source \ repos \ Crew.Tests \ Api \ APIFixture.cs (42,0): на Crew.Tests.Api.APIFixture. <> c. <. ctor> b__4_2 (IServiceProvider x) [2/4/2020 8: 16:50 AM Informational [xUnit. net 00: 00: 01.83] at lambda_method (Closure, ServiceProviderEngineScope) [04.04.2020 8:16:50 AM Informational] [xUnit. net 00: 00: 01.83 ] в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (поставщик IServiceProvider, тип serviceType) [2/4/2020 8:16:50 AM Informational] [xUnit. net 00: 00: 01.83] в Microsoft.Extensions.DependencyIn .ServiceProviderServiceExtensions.GetRequiredService [T] (поставщик IServiceProvider) [04.02.2020, 8:16:50 Информационный] [xUnit. net 00: 00: 01.83] C: \ Users \ source \ repos \ Crew.Tests \ Api \ Repositories \ CrewRequestRepositoryTests.cs (218,0): в Crew.Tests.Api.Repositories.CrewRequestRepositoryTests.RecordExists_SequenceNumberIsGreaterThanExistingRequest_MarkAsUpdate () * 10 * 20 * 20 * 10

1 Ответ

1 голос
/ 04 февраля 2020

DataContext - это класс System.Data.Linq. Это не может иметь это поле.

Вам нужно будет передать его.

public CrewRepository(MyFunkyContext dataContext) : base(dataContext)
{
    dataContext.UserId = (int)UserCode.System;
}

Если ваш класс на самом деле назван DataContext, тогда вам, вероятно, нужно будет квалифицировать его с полным пространством имен или , используя псевдоним , поэтому нет путаницы.

public CrewRepository(MyNamesSpace.Somethingelse.DataContext dataContext) : base(dataContext)
{
    dataContext.UserId = (int)UserCode.System;
}

или

using DataContext = MyNamesSpace.Somethingelse.DataContext;

public CrewRepository(DataContext dataContext) : base(dataContext)

Кажется, проблема в том, что он выбирает неправильный DataContext.

Я бы предложил назвать DbContext как нечто более конкретное c например MyContext

...