C# 在xUnit测试项目(.NET Core)中完成集成测试后,如何关闭Resharper测试运行程序?
我不熟悉集成测试。我的解决方案中有一个xUnit项目,它只包含一个测试。 以下是我的测试的定义:C# 在xUnit测试项目(.NET Core)中完成集成测试后,如何关闭Resharper测试运行程序?,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"
[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);
}
}
}
公共抽象类BaseIntegrationTest
{
私有常量字符串TestDatabaseName=“TestDatabase”;
受保护的BaseIntegrationTest()
{
var appFactory=new WebApplicationFactory()
.WithWebHostBuilder(builder=>
{
builder.ConfigureServices(服务=>
{
从服务集合中移除DatabaseContextFromServicesCollectionIFound(服务);
从服务集合中移除DatabaseContextFromServicesCollectionIFound(服务);
服务
.AddDbContext(选项=>
选项。UseInMemoryDatabase(TestDatabaseName))
.AddDbContext(选项=>
options.UseInMemoryDatabase(TestDatabaseName));
});
});
HttpClient=appFactory.CreateClient();
}
受保护的HttpClient HttpClient{get;}
受保护的静态StringContent序列化对象(object@object)=>
新内容(
JsonConvert.SerializeObject(@object),
Encoding.UTF8,
“应用程序/json”);
private static void RemoveDatabaseContextFromServicesCollectionIfFound(IServiceCollectionServices)
其中T:DbContext
{
变量描述符=服务。SingleOrDefault(服务=>
service.ServiceType==typeof(DbContextOptions));
如果(!(描述符为空))
{
服务
.删除(描述符);
}
}
}
当我运行测试时,只需几秒钟,测试就成功结束了。问题是Resharper测试运行程序仍然在运行,尽管我已经收集了结果。我做错了什么?在执行所有测试之后,我是否必须以某种方式处置HttpClient?如果是,如何做到这一点?谢谢你的帮助。
看起来您实际上是在测试内部启动应用程序,而不是使用testhost()
公共类基本测试
:IClassFixture
{
私有只读WebApplicationFactory\u工厂;
公共基本测试(WebApplicationFactory)
{
_工厂=工厂;
}
[理论]
[在线数据(“/”)]
[在线数据(“/索引”)]
[在线数据(“/About”)]
[在线数据(“/隐私”)]
[在线数据(“/Contact”)]
公共异步任务Get_EndpointsReturnSuccessAndCorrectContentType(字符串url)
{
//安排
var client=_factory.CreateClient();
//表演
var response=wait client.GetAsync(url);
//断言
response.ensureccessStatusCode();//状态代码200-299
Assert.Equal(“text/html;charset=utf-8”,
response.Content.Headers.ContentType.ToString());
}
}
请注意IClassFixture的内容。看起来您实际上是在测试内部启动应用程序,而不是使用testhost()
公共类基本测试
:IClassFixture
{
私有只读WebApplicationFactory\u工厂;
公共基本测试(WebApplicationFactory)
{
_工厂=工厂;
}
[理论]
[在线数据(“/”)]
[在线数据(“/索引”)]
[在线数据(“/About”)]
[在线数据(“/隐私”)]
[在线数据(“/Contact”)]
公共异步任务Get_EndpointsReturnSuccessAndCorrectContentType(字符串url)
{
//安排
var client=_factory.CreateClient();
//表演
var response=wait client.GetAsync(url);
//断言
response.ensureccessStatusCode();//状态代码200-299
Assert.Equal(“text/html;charset=utf-8”,
response.Content.Headers.ContentType.ToString());
}
}
注意IClassFixture的东西
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());
}
}