Внедрение зависимости не работает с ASPNETCore.TestHost

Я боролся много часов с этим вопросом. Мое приложение WebAPI прекрасно работает на локальном компьютере и на производственном сервере, но завершается неудачно во время интеграционного теста контроллера, в который внедрена зависимость. Все выглядит очень чисто, и я понятия не имею, почему это не работает.

Итак, вот и модули: Контроллер:

public SurveyController(IBoatInspectorRepository<Survey> repository)
{
    _repository = repository;
}

[HttpGet]
public IEnumerable<string> Get()
{
    return new string[] {"value1", "value2"};
}

Запуск:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IBoatInspectorRepository<Survey>, BoatInspectorRepository<Survey>>();
}

Тест:

[Test]
public async Task GetSurveyDb_NullReturn_ReturnNotFound()
{  
    using (var testServer = CreateTestServer())
    {
        var client = testServer.CreateClient();
        var value = await client.GetAsync("/api/survey/");
    }
}  

private TestServer CreateTestServer()
{
    var builder = new WebHostBuilder()                
        .UseStartup<Startup>()
        .ConfigureServices(services => 
            services.AddScoped<IBoatInspectorRepository<Survey>, BoatInspectorRepository<Survey>>());

    return new TestServer(builder);                
}

Если я отлаживаю это, отладчик даже не входит в конструктор контроллера. Если я закомментирую конструктор и создам пустой, все работает нормально, так что это 100% что-то, связанное с внедрением зависимости. Пожалуйста помоги. Спасибо.


ОБНОВЛЕНИЕ 1

Таким образом, кажется, что это проблема с инициализацией контекста, потому что если я сделаю следующее, конструктор тоже не будет инициализирован.

    public SurveyController(BoatInspectorContext context)
    {
     //debuger doesn't go inside here so must be something with context   
    }

1 ответ

Итак, после двух бессонных ночей я обнаружил ошибку... По какой-то непонятной причине тестовый сервер не смог прочитать строку подключения к моей базе данных из apsettings.json, используя

.AddDbContext<BoatInspectorContext>(
                opt=>opt.UseNpgsql(Configuration.GetConnectionString("BoatInspectorConnectionString")));

так что все что мне нужно было

.AddDbContext<BoatInspectorContext>(
                opt => opt.UseNpgsql(
                    connectionString:
                    "my_magic_connection_string"));

По какой-то причине эта ошибка нигде не появлялась, или, может быть, я ее не видел, после того, как сказал, что это было довольно очевидно.

Другие вопросы по тегам