Внедрение зависимостей AspNetCore.TestHost в контроллер возвращает ошибку 500
Я хочу запустить тестовый сервер для размещения моего основного веб-приложения api asp.net с помощью AspNetCore.TestHost и запустить некоторые тесты с помощью nUnit. Итак, вот части:
Бит контроллера:
[Route("api/[controller]")]
public class SurveyController : Controller
{
[HttpGet("{surveyId}")]
public async Task<IActionResult> GetSurvey(int surveyId)
{
var entity = await _repository.GetEntity(surveyId);
if (entity==null)
return NotFound();
return Ok(entity);
}
}
Я отправляю surveyId = 0. Если я проверяю это в браузере или почтальоне, я получаю 404 Not Found - отлично. Однако, когда я запускаю тест, я получаю 200 Ok, и я возвращаюсь к маршруту по умолчанию из класса запуска, который выглядит следующим образом:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//this one ignored in tests but works fine in postman
app.UseMvc();
//i get this response for some reason
app.Run(async (context) =>
{
await context.Response.WriteAsync("MVC didn't find anything to route to!");
});
}
Так вот мои тестовые подтексты Контекст
public class TestContext
{
private TestServer _server;
public HttpClient Client {
get;
private set;
}
public TestContext()
{
SetUpClient();
}
private void SetUpClient()
{
_server = new TestServer(new WebHostBuilder().UseStartup < Startup > ());
Client = _server.CreateClient();
}
}
Тест
[Test]
public async Task GetSurveyDb_NullReturn_ReturnNotFound()
{
var response = await _sut.Client.GetAsync(":5000/api/survey/0");
//response.EnsureSuccessStatusCode();
var result = response.StatusCode;
var wtf= await response.Content.ReadAsStringAsync();
var expected = System.Net.HttpStatusCode.NotFound;
Assert.That(result, Is.EqualTo(expected));
}
Хотя, возможно, это связано с:5000/api/survey/0, который вставляется в адрес клиента, но я испробовал почти все возможные решения. Если я не введу: 5000, я на самом деле получаю ошибку 500, вероятно, потому что по умолчанию http://localhost/
Во всяком случае, я немного смущен тем, что маршрут не происходит. Кто-нибудь сталкивался с такой проблемой? Благодарю.
ОБНОВЛЕНИЕ 1 Итак, я нашел, что вызывает ошибку. Это внедрение зависимости в конструктор контроллера, которое выглядит следующим образом.
private readonly IBoatInspectorRepository<Survey> _repository;
public SurveyController(IBoatInspectorRepository<Survey> repository)
{
_repository = repository;
}
Он добавляется в класс запуска следующим образом:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IBoatInspectorRepository<Survey>, BoatInspectorRepository<Survey>>();
services.AddMvc();
services.AddEntityFrameworkNpgsql()
.AddDbContext<BoatInspectorContext>(
opt=>opt.UseNpgsql(Configuration.GetConnectionString("BoatInspectorConnectionString")));
}
Так что, если я выключу конструктор, все работает... Не уверен, что теперь делать, однако.
ОБНОВЛЕНИЕ 2
Итак, теперь я представил два конструктора в классе контроллера. Пустой и еще один с уколом. Выглядит так:
private readonly IBoatInspectorRepository<Survey> _repository;
public SurveyController()
{
}
public SurveyController(IBoatInspectorRepository<Survey> repository)
{
_repository = repository;
}
Если я закомментирую второй, отладка переходит к первому, и мы видим выполненные методы контроллера. Если я не прокомментирую это, отладка не войдет ни в одну из них, и я получу 500 ошибок. Я не понимаю, где я могу поймать его для отладки тоже... На рабочем сервере все работает, кстати, я забыл, упомянул я это или нет.