如何在 xUnit 测试项目(.NET Core)中完成集成测试后关闭 Resharper 测试运行器?

Posted

技术标签:

【中文标题】如何在 xUnit 测试项目(.NET Core)中完成集成测试后关闭 Resharper 测试运行器?【英文标题】:How to close Resharper test runner after finishing integration test in xUnit Test project (.NET Core)? 【发布时间】:2020-10-06 15:20:30 【问题描述】:

我是集成测试的新手。我的解决方案中有一个 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】:

看起来您实际上是在测试中启动应用程序,而不是使用测试主机 (https://docs.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 的东西。

【讨论】:

以上是关于如何在 xUnit 测试项目(.NET Core)中完成集成测试后关闭 Resharper 测试运行器?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 .NET Core 运行 xUnit 测试

无法使用 .NET Core 运行 xUnit 测试

.Net core基于xUnit的单元测试查看测试覆盖率

.Net core基于xUnit的单元测试查看测试覆盖率

.Net core基于xUnit的单元测试查看测试覆盖率

xUnit文化意识测试