Внедрение зависимости не работает с 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"));
По какой-то причине эта ошибка нигде не появлялась, или, может быть, я ее не видел, после того, как сказал, что это было довольно очевидно.