Xunit.net 运行 一次 运行 时,异步方法会导致错误
Xunit.net running Async method leads to error when running at once
响应另一个 ,当 运行 async Task with Xunit 和 visual studio 2015 ctp6 时,我遇到了一个问题。
代码如下:
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.TestHost;
using Microsoft.Framework.DependencyInjection;
using Xunit;
using Microsoft.AspNet.Builder;
using System.Net.Http;
namespace Multi.Web.Api
{
public class TestServerHelper : IDisposable
{
public TestServerHelper()
{
ClientProvider = new TestClientProvider();
ApiServer = TestServer.Create((app) =>
{
app.UseServices(services =>
{
services.AddTransient<IClientProvider>(s => ClientProvider);
});
app.UseMulti();
});
}
public TestClientProvider ClientProvider { get; private set; }
public TestServer ApiServer { get; private set; }
public void Dispose()
{
ApiServer.Dispose();
ClientProvider.Dispose();
}
}
public class MultiMiddlewareTest : IClassFixture<TestServerHelper>
{
TestServerHelper _testServerHelper;
public MultiMiddlewareTest(TestServerHelper testServerHelper)
{
_testServerHelper = testServerHelper;
}
[Fact]
public async Task ShouldReturnToday()
{
using (HttpClient client = _testServerHelper.ApiServer.CreateClient())
{
var response = await client.GetAsync("http://localhost/today");
String content = await response.Content.ReadAsStringAsync();
Assert.Equal(content, "2015-04-15 count is 1");
}
}
[Fact]
public async Task ShouldReturnYesterday()
{
using (HttpClient client = _testServerHelper.ApiServer.CreateClient())
{
var response = await client.GetAsync("http://localhost/yesterday");
String content = await response.Content.ReadAsStringAsync();
Assert.Equal(content, "2015-04-14 count is 1");
}
}
}
}
在visual studioTestExplorer中,当运行一个一个测试(右击select调试selected测试) 没关系,但是当 运行 全部通过时,none 并且我有以下错误
Message : Response status code does not indicate success : 404 (Not Fount)
所有代码都可以在另一个问题上找到,在那个问题中,我回答了如何使用 TestServer 的多个实例来模拟外部 Api。我认为这与某些同步上下文有关。
我认为我编写 Helper 的方式不是很好,因为我看到它在调用实际完成之前处理对象(有时不是...)。有人有同样的问题并对此有解决方案吗?
当您 运行 所有测试时,Xunit 默认 运行 并行测试;我猜这可能会导致您的测试服务器发生冲突并产生副作用。 (我不确定您在 project.json 中使用的所有包是什么,所以我可能会弄错。)查看 Xunit 文档中的 Running tests in parallel 并找到适合您的解决方案。
选项:
- 使用
CollectionAttribute
例如 [Collection("Localhost http server")]
.
- 在命令行中指定
-parallel none
作为选项。
- 使用程序集属性更改默认行为,例如
[assembly: CollectionBehavior(DisableTestParallelization = true)]
更新 2:
更新 1 是一个转移注意力的问题,所以我将其完全删除。从 FakeExternalApi
中间件中删除 await next(context);
似乎已经消除了间歇性问题。 A comment from @Tratcher 表示 "calling Next ... is discouraged," 但我不确定这是否与 OwinMiddleware 特别相关,或者它是否是很好的一般性建议,但它似乎适用于此。
响应另一个
代码如下:
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.TestHost;
using Microsoft.Framework.DependencyInjection;
using Xunit;
using Microsoft.AspNet.Builder;
using System.Net.Http;
namespace Multi.Web.Api
{
public class TestServerHelper : IDisposable
{
public TestServerHelper()
{
ClientProvider = new TestClientProvider();
ApiServer = TestServer.Create((app) =>
{
app.UseServices(services =>
{
services.AddTransient<IClientProvider>(s => ClientProvider);
});
app.UseMulti();
});
}
public TestClientProvider ClientProvider { get; private set; }
public TestServer ApiServer { get; private set; }
public void Dispose()
{
ApiServer.Dispose();
ClientProvider.Dispose();
}
}
public class MultiMiddlewareTest : IClassFixture<TestServerHelper>
{
TestServerHelper _testServerHelper;
public MultiMiddlewareTest(TestServerHelper testServerHelper)
{
_testServerHelper = testServerHelper;
}
[Fact]
public async Task ShouldReturnToday()
{
using (HttpClient client = _testServerHelper.ApiServer.CreateClient())
{
var response = await client.GetAsync("http://localhost/today");
String content = await response.Content.ReadAsStringAsync();
Assert.Equal(content, "2015-04-15 count is 1");
}
}
[Fact]
public async Task ShouldReturnYesterday()
{
using (HttpClient client = _testServerHelper.ApiServer.CreateClient())
{
var response = await client.GetAsync("http://localhost/yesterday");
String content = await response.Content.ReadAsStringAsync();
Assert.Equal(content, "2015-04-14 count is 1");
}
}
}
}
在visual studioTestExplorer中,当运行一个一个测试(右击select调试selected测试) 没关系,但是当 运行 全部通过时,none 并且我有以下错误
Message : Response status code does not indicate success : 404 (Not Fount)
所有代码都可以在另一个问题上找到,在那个问题中,我回答了如何使用 TestServer 的多个实例来模拟外部 Api。我认为这与某些同步上下文有关。
我认为我编写 Helper 的方式不是很好,因为我看到它在调用实际完成之前处理对象(有时不是...)。有人有同样的问题并对此有解决方案吗?
Xunit 默认 运行 并行测试;我猜这可能会导致您的测试服务器发生冲突并产生副作用。 (我不确定您在 project.json 中使用的所有包是什么,所以我可能会弄错。)查看 Xunit 文档中的 Running tests in parallel 并找到适合您的解决方案。
选项:
- 使用
CollectionAttribute
例如[Collection("Localhost http server")]
. - 在命令行中指定
-parallel none
作为选项。 - 使用程序集属性更改默认行为,例如
[assembly: CollectionBehavior(DisableTestParallelization = true)]
更新 2:
更新 1 是一个转移注意力的问题,所以我将其完全删除。从 FakeExternalApi
中间件中删除 await next(context);
似乎已经消除了间歇性问题。 A comment from @Tratcher 表示 "calling Next ... is discouraged," 但我不确定这是否与 OwinMiddleware 特别相关,或者它是否是很好的一般性建议,但它似乎适用于此。