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

0 ответов

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