Я пытаюсь запустить интеграционные тесты на простом контроллере, который возвращает данные из структуры объекта. Я написал модульные тесты и все работает как положено.
Я подключил тесты интеграции xUnit, но когда я запускаю простой Get to my controller, я получаю 404 not found. Если я запускаю проект в браузере и запускаю get через почтальона, я нажимаю на контроллер и действую правильно.
My xUnit TestFixture Class
public sealed class TestFixture<TStartup> : IDisposable where TStartup : class
{
public readonly TestServer Server;
public readonly HttpClient Client;
public TestFixture()
{
var builder = BuildWebHost();
Server = new TestServer(builder);
Client = Server.CreateClient();
}
public static IWebHostBuilder BuildWebHost()
{
var host = new WebHostBuilder()
.UseStartup<TestStartup>()
.ConfigureAppConfiguration((hostContext, config) =>
{
config.Sources.Clear();
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.test.json", optional: true, reloadOnChange: true);
});
return host;
}
}
Мой тестовый класс контроллера
public class FlowApiControllerTests : IClassFixture<TestFixture<Startup>>
{
private readonly HttpClient _httpClient;
public FlowApiControllerTests(TestFixture<Startup> fixture)
{
_httpClient = fixture.Client;
}
[Fact]
public async Task Get_FlowApiTest()
{
var response = await _httpClient.GetAsync("/flowapi");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var content = await response.Content.ReadAsStringAsync();
var model = JsonConvert.DeserializeObject<List<FlowApi>>(content);
model.Count.Should().Be(2);
}
}
и, наконец, мой контроллер
[Route("[controller]")]
[ApiController]
public class FlowApiController : ControllerBase
{
private readonly IFlowApiRepository _repository;
public FlowApiController(IFlowApiRepository repository)
{
_repository = repository;
}
// GET: api/FlowApi
[HttpGet]
public async Task<IActionResult> Get()
{
var result = await _repository.Select<FlowApi>();
return Ok(result);
}
}
Я не могу понять, почему я не попал в контроллер в своих тестах, но могу ударить его от почтальона.