Joh*_*ing 3 c# xunit.net async-await teamcity-9.0
我做了以下xUnit测试,该测试使用HttpClient在Web服务器上调用状态api方法.
[Fact]
public void AmIAliveTest()
{
var server = TestServer.Create<Startup>();
var httpClient = server.HttpClient;
var response = httpClient.GetAsync("/api/status").Result;
response.StatusCode.Should().Be(HttpStatusCode.OK);
var resultString = response.Content.ReadAsAsync<string>().Result;
resultString.Should().Be("I am alive!");
}
Run Code Online (Sandbox Code Playgroud)
这个测试在本地运行良好.但是当我提交代码并尝试在TeamCity构建服务器上运行相同的测试时,它会永远运行.我甚至必须杀死xunit runner进程,因为停止构建不会停止此进程.
但是当我这样写测试时
[Fact]
public async void AmIAliveTest()
{
var server = TestServer.Create<Startup>();
var httpClient = server.HttpClient;
var response = await httpClient.GetAsync("/api/status");
response.StatusCode.Should().Be(HttpStatusCode.OK);
var resultString = await response.Content.ReadAsAsync<string>();
resultString.Should().Be("I am alive!");
}
Run Code Online (Sandbox Code Playgroud)
它在本地运行良好,也在TeamCity上运行.
我现在担心的是,我忘了像第二个版本那样编写测试,并且偶尔会出现teamcity版本.
任何人都可以向我解释为什么在teamcity buildserver上运行的xUnit首先没有正确运行测试?有解决方案可以解决这个问题吗?
任何人都可以向我解释为什么在teamcity buildserver上运行的xUnit首先没有正确运行测试?
首先,我会检查你的xUnit版本 - 你应该运行最近发布的2.0版本.我怀疑你的本地版本可能已经过时了.
核心问题在于这一行:
var resultString = response.Content.ReadAsAsync<string>().Result;
Run Code Online (Sandbox Code Playgroud)
我怀疑你遇到了我在博客上描述的僵局.HttpClient在某些平台上有一些方法没有正确使用ConfigureAwait(false),因此会遇到这种僵局.xUnit 2.0 SynchronizationContext在其所有单元测试中安装单线程,这提供了另一半的死锁场景.
正确的解决办法是更换Result用await,和你的单元测试方法的返回类型的变化void来Task.
| 归档时间: |
|
| 查看次数: |
758 次 |
| 最近记录: |