Непоследовательное поведение тестирования при наблюдении за субъектом для завершения

Когда я пишу тесты, которые включают подписку на события в Eventstream или наблюдение за актерами и перечисление «Завершено», тесты работают нормально, запуская их 1 за 1, но когда я запускаю весь набор тестов, эти тесты терпят неудачу. Тесты также работают, если каждый из этих тестов находится в отдельном тестовом классе Xunit.

Почему?

Репозиторий с такими тестами: https://github.com/Lejdholt/AkkaTestError


person Lejdholt    schedule 23.11.2016    source источник
comment
Я проверил это с помощью NUnit, и если я запускаю все тесты вместе, GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess каждый раз надежно терпит неудачу. Это всегда работает, если я запускаю один тест в одиночку. Но все тесты вместе работают нормально, если я переупорядочу их, выполнив GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess в качестве первого.   -  person Haukinger    schedule 02.12.2016


Ответы (1)


Посмотрел ваш репозиторий. Я могу воспроизвести проблемы, которые вы описываете.

Похоже на ошибку в TestKit, где-то проблема со временем. Но его трудно зафиксировать. Кроме того, не все среды модульного тестирования созданы одинаково. Тестовый набор использует собственный TaskDispatcher для тестирования операций, которые обычно являются асинхронными. Иногда это вызывает некоторые конфликты с используемой тестовой средой. Это также случайное совпадение, почему akka.net также перешел на XUnit для своего собственного процесса CI.

Мне удалось решить вашу проблему, не используя TestProbe. Хотя я не уверен, связана ли проблема с TestProbe, скажем, или с тем фактом, что вы используете глобальную ссылку (ваша переменная «процесс»). Я подозреваю, что testframework, выполняя тесты параллельно, может вызывать некоторые странные вещи, происходящие с вашей ссылкой testprobe.

Пример того, как я изменил один из ваших тестов:

     [Test]
    public void GivenAnyTime_WhenProcessTerminates_ShouldLogStartRemovingProcess()
    {
        IProcessFactory factory = Substitute.For<IProcessFactory>();
        var testactor = Sys.ActorOf<FakeActor>("test2");
        processId = Guid.NewGuid();
        factory.Create(Arg.Any<IActorRefFactory>(), Arg.Any<SupervisorStrategy>()).Returns(testactor);
        manager = Sys.ActorOf(Props.Create(() => new Manager(factory)));

        manager.Tell(new StartProcessCommand(processId));

        EventFilter.Info("Removing process.")
            .ExpectOne(() => Sys.Stop(testactor));
    }

Должно быть довольно понятно, как вы должны изменить свой другой тест. FakeActor — это не что иное, как пустая реализация ReceiveActor.

person Danthar    schedule 02.12.2016