HttpClient GET возвращает 404 не найдено - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь запустить интеграционные тесты на простом контроллере, который возвращает данные из структуры объекта. Я написал модульные тесты и все работает как положено.

Я подключил тесты интеграции 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);
    }
}

Я не могу понять, почему я не попал в контроллер в своих тестах, но могу ударить его от почтальона.

1 Ответ

2 голосов
/ 17 октября 2019

Спасибо @Ajeet Kumar за указание на направление WebApplicationFactory, я выбрал документацию по тестированию интеграции ядра ASP.NET и изменил свой класс TestFixture, чтобы отразить этот подход. Я также импортировал пакет nuget Microsoft.AspNetCore.Mvc.Testing. Мой класс TestFixture теперь выглядит как

protected override void ConfigureWebHost(IWebHostBuilder builder)
{
        builder.ConfigureServices(services =>
        {
            var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<ApiContext>));

            if (descriptor != null)
            {
                services.Remove(descriptor);
            }

            // Add ApplicationDbContext using an in-memory database for testing.
            services.AddDbContext<ApiContext>((options, context) =>
            {
                context.UseInMemoryDatabase("InMemoryDbForTesting");
            });

            services.AddTransient<DatabaseSeeder>();

            // Build the service provider.
            var sp = services.BuildServiceProvider();

            using (var scope = sp.CreateScope())
            {
                var scopedServices = scope.ServiceProvider;
                var db = scopedServices.GetRequiredService<ApiContext>();

                // Ensure the database is created.
                db.Database.EnsureCreated();

                try
                {
                    // Seed the database with test data.
                    var seeder = scopedServices.GetService<DatabaseSeeder>();
                    seeder.SeedFlowApplicationData().Wait();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...