如何在 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 测试运行器?的主要内容,如果未能解决你的问题,请参考以下文章