运行异步方法的Xunit.net会在一次运行时导致错误

时间:2015-04-15 15:16:46

标签: c# asp.net asp.net-core xunit.net

作为另一个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。我认为这与一些同步上下文有关。

我认为我写的助手不是很好,因为我看到它在实际调用之前处理了对象(有时候不是......)。有人有同样的问题,并有解决方案吗?

更新link to full code on github

1 个答案:

答案 0 :(得分:4)

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

选项:

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

    更新2

    更新1是一个红鲱鱼,所以我完全删除了它。从await next(context);中间件中删除FakeExternalApi似乎已消除了间歇性问题。 A comment from @Tratcher表示不鼓励调用Next ...&#34;但我不确定这是否与OwinMiddleware特别相关,或者它是否是一般意见,但它似乎适用于此。