作为另一个SO questions的回应,我在使用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 studio TestExplorer中,当逐个运行测试时(右键单击并选择 debug selected test ),没关系,但是当全部运行时,没有任何通行证,我有以下错误< / p>
Message : Response status code does not indicate success : 404 (Not Fount)
所有代码都可用于另一个问题,在那个问题中,我回答了如何使用TestServer的多个实例来模拟外部Api。我认为这与一些同步上下文有关。
我认为我写的助手不是很好,因为我看到它在实际调用之前处理了对象(有时候不是......)。有人有同样的问题,并有解决方案吗?
答案 0 :(得分:4)
当您运行所有测试时,Xunit默认并行运行您的测试;我猜测这可能会导致您的测试服务器发生碰撞并产生副作用。 (我不确定你在project.json中使用的所有软件包,所以我可能会弄错。)在Xunit文档中查看Running tests in parallel并找到适合您的解决方案
选项:
CollectionAttribute
,例如[Collection("Localhost http server")]
。-parallel none
作为选项。[assembly: CollectionBehavior(DisableTestParallelization = true)]
更新2 :
更新1是一个红鲱鱼,所以我完全删除了它。从await next(context);
中间件中删除FakeExternalApi
似乎已消除了间歇性问题。 A comment from @Tratcher表示不鼓励调用Next ...&#34;但我不确定这是否与OwinMiddleware特别相关,或者它是否是一般意见,但它似乎适用于此。