Xunit.net, использующий асинхронный метод, приводит к ошибке при одновременном запуске

В ответ на другие SO вопросы , я столкнулся с проблемой при запуске асинхронной задачи с 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");
                }
            }
        }
    }

в визуальной студии TestExplorer при запуске теста по одному (щелкните правой кнопкой мыши и выберите отладить выбранный тест) все в порядке, но при запуске всех ни один из проходов, и у меня есть следующая ошибка

Message : Response status code does not indicate success : 404 (Not Fount)

весь код доступен по другому вопросу, поэтому в этом вопросе я ответил, как использовать несколько экземпляров TestServer для имитации внешнего API. И я думаю, что это связано с некоторым контекстом синхронизации.

Я думаю, что написал свой помощник не лучшим образом, потому что я вижу, что он удаляет объекты до фактического выполнения вызова (иногда нет...). у кого-то была такая же проблема и было решение по этому поводу?

ОБНОВЛЕНИЕ: ссылка на полный код на github


person Cedric Dumont    schedule 15.04.2015    source источник


Ответы (1)


Xunit запускает ваши тесты параллельно по умолчанию, когда вы запускаете все тесты; Я предполагаю, что это, вероятно, вызывает конфликты ваших тестовых серверов и побочные эффекты. (Я не уверен, какие пакеты вы используете в своем проекте project.json, поэтому могу ошибаться.) Взгляните на Параллельное выполнение тестов в документации Xunit и найдите подходящее решение.

Опции:

  1. Используйте CollectionAttribute, например [Collection("Localhost http server")].
  2. Укажите -parallel none в качестве опции в командной строке.
  3. Измените поведение по умолчанию, используя атрибут сборки, такой как [assembly: CollectionBehavior(DisableTestParallelization = true)]

ОБНОВЛЕНИЕ 2:

Обновление 1 было отвлекающим маневром, поэтому я полностью удалил его. Удаление await next(context); из промежуточного программного обеспечения FakeExternalApi, похоже, устранило периодически возникающие проблемы. Комментарий от @Tratcher указывает, что "вызов Next... не рекомендуется", но я не уверен, что это конкретно относится к OwinMiddleware или если это хороший общий совет, но, похоже, он применим и здесь.

person Matt DeKrey    schedule 16.04.2015
comment
На самом деле я вижу, что если тестовые методы находятся в одном классе, они не выполняются параллельно. Тем не менее, я попытался сделать это с этими комментариями, но это не сработало. Я подожду, пока некоторые библиотеки xunit не перестанут быть бета-версиями. - person Cedric Dumont; 16.04.2015
comment
@CedricDumont, я обновил свой ответ, учитывая ваш полный исходный код. Спасибо за предоставление! - person Matt DeKrey; 17.04.2015
comment
Я зафиксировал изменения в репо, но это не решило проблему. примечание: я использую Visual Studion ctp6. возможно, это оттуда. - person Cedric Dumont; 17.04.2015
comment
О, вау, это прерывисто; если я запускаю без отладки, обычно все идет нормально. Смотреть больше! - person Matt DeKrey; 17.04.2015
comment
Надеюсь, я наконец решил вашу проблему, @CedricDumont. Было интересно отлаживать; Я еще не сделал никакого промежуточного программного обеспечения. - person Matt DeKrey; 17.04.2015
comment
да, это решает проблему. но интересно, почему .... Я также подожду окончательного выпуска asp.net 5, чтобы снова протестировать его. - person Cedric Dumont; 20.04.2015