2016-11-23 95 views
2

當我編寫測試時涉及在EventStream上訂閱事件或觀看演員並列出「終止」列表時,測試可以一個一個地正常運行它們,但是當我運行整個測試套件那些測試失敗。 如果每個測試都在與Xunit單獨的測試課程中,那麼測試也可以使用。觀看演員終止時的測試行爲不一致

怎麼回事?

這些類型的測試回購:https://github.com/Lejdholt/AkkaTestError

+0

我用NUnit測試了這個,如果我一起運行所有測試'GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess'每次都可靠地失效。如果我單獨運行一個測試,它總是有效。但是,如果我重新排序它們,執行'GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess'作爲第一個,所有測試一起運行良好。 – Haukinger

回答

1

看了一下你的資料庫。我可以重現你所描述的問題。

感覺就像TestKit中的一個錯誤,在某個時機問題。但很難確定。另外,並非所有的單元測試框架都是平等創建的。該測試包使用其自己的TaskDispatcher來啓用對通常固有的異步處理操作的測試。 這有時會導致與正在使用的測試框架發生一些衝突。同樣巧合的是,爲什麼akka.net也爲了他們自己的CI過程而搬到了XUnit。

我已經設法解決您的問題,通過不使用TestProbe。雖然我不確定問題出在TestProbe的說法上,還是說你在哪裏使用全局引用(你的'process'變量)。 我懷疑測試框架在並行運行測試時可能會導致一些奇怪的事情發生在您的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實現。