2016-08-25 31 views
0

以下是的,我已經定義了演員(試圖讓我的持久化的演員頭上!)Akka.net Testkit沒有標註的測試用例失敗,儘管ActorInitializationException例外

public class Country : ReceivePersistentActor 
{ 
    public override string PersistenceId => GetType().Name + state.Id; 

    private CountryState state; 

    public Country() 
    { 
     Command<CreateCountry>(CreateCountry); 
    } 

    private bool CreateCountry(CreateCountry cmd) 
    { 
     Persist(new CountryCeated 
     { 
      Id = cmd.Id, 
      Code = cmd.Code, 
      Description = cmd.Description, 
      Active = cmd.Active 
     }, evt => 
     { 
      state = new CountryState 
      { 
       Id = evt.Id, 
       Code = evt.Code, 
       Description = evt.Description, 
       Active = evt.Active 
      }; 
     }); 

     return true; 
    } 
} 

以下是單元測試用例我定義:

[TestClass] 
public class CountrySpec : TestKit 
{ 
    [TestMethod] 
    public void CountryActor_Should_Create_A_Country() 
    { 
     var country = Sys.ActorOf(Props.Create(() => new Country()), "Country"); 
     country.Tell(new CreateCountry(Guid.NewGuid(), "UK", "United Kingdom", true)); 
     ExpectNoMsg(); 
    } 
} 

當我運行測試的情況下,有一個例外,我可以在測試用例的輸出窗口中看到

[ERROR][25/08/2016 08:25:07][Thread 0007][akka://test/user/Country] Object reference not set to an instance of an object. 
Cause: [akka://test/user/Country#552449332]: Akka.Actor.ActorInitializationException: Exception during creation ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at Domain.Country.get_PersistenceId() in Y:\Spikes\StatefulActors\Domain\Country.cs:line 9 
    at Akka.Persistence.Eventsourced.StartRecovery(Recovery recovery) 
    at Akka.Persistence.Eventsourced.AroundPreStart() 
    at Akka.Actor.ActorCell.<>c__DisplayClass154_0.<Create>b__0() 
    at Akka.Actor.ActorCell.UseThreadContext(Action action) 
    at Akka.Actor.ActorCell.Create(Exception failure) 
    --- End of inner exception stack trace --- 
    at Akka.Actor.ActorCell.Create(Exception failure) 
    at Akka.Actor.ActorCell.SysMsgInvokeAll(EarliestFirstSystemMessageList messages, Int32 currentState) 

但測試用例被標記爲成功 enter image description here

有沒有在TestKit,它可以被設置爲使得任何例外,標誌着測試案例失敗的任何方式/設置嗎?

回答

1

默認情況下,actor中的任何異常都被封裝 - 這意味着它們不會冒泡,吹動系統的其餘部分。

參與者進入系統,並且可以通過觀察他們相互通信的方式進行測試。通常它會提供來自角色系統的輸入和斷言輸出 - 在您的測試已通過的情況下,因爲您尚未驗證任何輸出。從你的測試角度來看,這位演員可能已經死了,這不會有什麼不同。

驗證輸出(通過演員自身內部的斷言或使用自定義測試日誌)是使用測試的最佳方式。

如果由於某種原因,你仍然必須抓住裏面的演員,你可以創建一個綁定IE瀏覽器TestActor,監督策略的例外,所有異常可以轉發:

public class TestingStrategy : OneForOneStrategy 
{ 
    protected TestingStrategy(IActorRef probe) : base(exception => 
    { 
     probe.Tell(exception); 
     return DefaultDecider.Decide(exception); 
    }) { } 
} 
+0

謝謝你的回答,現在是有道理的爲什麼測試沒有失敗。您可以請幫助/分享如何設置自定義測試日誌的鏈接? – 101V