2016-11-23 6 views
2

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

Почему?

РЕПО- с тем видом тестов: https://github.com/Lejdholt/AkkaTestError

+0

Я тестировал это с помощью NUnit, и если я буду запускать все тесты вместе, то «GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess» надежно отказывается каждый раз. Он всегда работает, если я запускаю только один тест. Но все тесты вместе работают нормально, если я их переупорядочу, выполняя «GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess» как первый. – Haukinger

ответ

1

взглянул на вашем хранилище. Я могу воспроизвести проблемы, которые вы описываете.

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

Мне удалось исправить вашу проблему, не используя TestProbe. Хотя я не уверен, что проблема связана с TestProbe за отзыв, или тот факт, что вы используете глобальную ссылку (ваша переменная «process»). Я подозреваю, что тестовая сценария при выполнении тестов в parrallel может привести к возникновению каких-то странных вещей с вашей ссылкой на 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 реализация.

 Смежные вопросы

  • Нет связанных вопросов^_^