Как закрыть Resharper test runner после завершения интеграционного теста в тестовом проекте xUnit (.NET Core)?

#c# #asp.net-core #resharper #xunit #rider

#c# #asp.net-core #resharper #xunit #rider

Вопрос:

я новичок в интеграционных тестах. В моем решении есть проект xUnit, который содержит только один тест. Вот определение моего теста:

 [Fact]
public async Task ShouldCreateUser()
{
    // Arrange
    var createUserRequest = new CreateUserRequest
    {
        Login = "testowyLogin",
        Password = "testoweHaslo",
        FirstName = "testoweImie",
        LastName = "testoweNazwisko",
        MailAddress = "test@test.pl"
    };
    var serializedCreateUserRequest = SerializeObject(createUserRequest);
    
    // Act
    var response = await HttpClient.PostAsync(ApiRoutes.CreateUserAsyncRoute,
        serializedCreateUserRequest);
    
    // Assert
    response
        .StatusCode
        .Should()
        .Be(HttpStatusCode.OK);
}
  

И определение класса BaseIntegrationTest:

 public abstract class BaseIntegrationTest
{
    private const string TestDatabaseName = "TestDatabase";
    
    protected BaseIntegrationTest()
    {
        var appFactory = new WebApplicationFactory<Startup>()
            .WithWebHostBuilder(builder =>
            {
                builder.ConfigureServices(services =>
                {
                    RemoveDatabaseContextFromServicesCollectionIfFound<EventStoreContext>(services);
                    RemoveDatabaseContextFromServicesCollectionIfFound<GrantContext>(services);
                    
                    services
                        .AddDbContext<EventStoreContext>(options =>
                            options.UseInMemoryDatabase(TestDatabaseName))
                        .AddDbContext<GrantContext>(options =>
                            options.UseInMemoryDatabase(TestDatabaseName));
                });
            });
        
        HttpClient = appFactory.CreateClient();
    }

    protected HttpClient HttpClient { get; }
    
    protected static StringContent SerializeObject(object @object) =>
        new StringContent(
            JsonConvert.SerializeObject(@object),
            Encoding.UTF8,
            "application/json");

    private static void RemoveDatabaseContextFromServicesCollectionIfFound<T>(IServiceCollection services)
        where T : DbContext
    {
        var descriptor = services.SingleOrDefault(service =>
            service.ServiceType == typeof(DbContextOptions<T>));

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

Когда я запускаю тесты, это занимает несколько секунд, и тест завершается успешно. Проблема в том, что Resharper Test Runner все еще выполняется, хотя я уже собрал результаты. что я здесь делаю не так? Должен ли я каким-то образом утилизировать HttpClient после выполнения всех тестов? Если да, то как этого добиться? Спасибо за любую помощь.
введите описание изображения здесь

Ответ №1:

Похоже, вы на самом деле загружаете приложение внутри теста, а не используете testhost (https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-3.1 )

 public class BasicTests 
    : IClassFixture<WebApplicationFactory<RazorPagesProject.Startup>>
{
    private readonly WebApplicationFactory<RazorPagesProject.Startup> _factory;

    public BasicTests(WebApplicationFactory<RazorPagesProject.Startup> factory)
    {
        _factory = factory;
    }

    [Theory]
    [InlineData("/")]
    [InlineData("/Index")]
    [InlineData("/About")]
    [InlineData("/Privacy")]
    [InlineData("/Contact")]
    public async Task Get_EndpointsReturnSuccessAndCorrectContentType(string url)
    {
        // Arrange
        var client = _factory.CreateClient();

        // Act
        var response = await client.GetAsync(url);

        // Assert
        response.EnsureSuccessStatusCode(); // Status Code 200-299
        Assert.Equal("text/html; charset=utf-8", 
            response.Content.Headers.ContentType.ToString());
    }
}
  

Обратите внимание на материал IClassFixture.