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 的方式不是很好,因为我看到它在调用实际完成之前处理对象(有时不是...)。有人有同样的问题并对此有解决方案吗?

更新 : link to full code on github

当您 运行 所有测试时,

Xunit 默认 运行 并行测试;我猜这可能会导致您的测试服务器发生冲突并产生副作用。 (我不确定您在 project.json 中使用的所有包是什么,所以我可能会弄错。)查看 Xunit 文档中的 Running tests in parallel 并找到适合您的解决方案。

选项:

  1. 使用 CollectionAttribute 例如 [Collection("Localhost http server")].
  2. 在命令行中指定 -parallel none 作为选项。
  3. 使用程序集属性更改默认行为,例如 [assembly: CollectionBehavior(DisableTestParallelization = true)]

更新 2:

更新 1 是一个转移注意力的问题,所以我将其完全删除。从 FakeExternalApi 中间件中删除 await next(context); 似乎已经消除了间歇性问题。 A comment from @Tratcher 表示 "calling Next ... is discouraged," 但我不确定这是否与 OwinMiddleware 特别相关,或者它是否是很好的一般性建议,但它似乎适用于此。