2016-07-18 43 views
1

我有一個Actor,當它接收到StartMessage時,它應該使用Become(Started)更改狀態。我該如何測試演員的狀態是否已更改爲Started()如何測試Akka.Net Actor狀態(使用成爲())

MyActor類

public class MyActor : ReceiveActor 
{ 
    public MyActor() 
    { 
     Receive<StartMessage>(s => { 
      Become(Started); // This is what I want to unit test 
     }); 
    } 

    private void Started() 
    { 
     Console.WriteLine("Woo hoo! I'm started!"); 
    } 
} 

單元測試

 [TestMethod] 
    public void My_actor_changes_state_to_started() 
    { 
     // Arrange 
     var actor = ActorOfAsTestActorRef<MyActor>(Props.Create(() => new MyActor())); 

     // Act 
     actor.Tell(new StartMessage()); 

     // Assert 
     var actorsCurrentState = actor.UnderlyingActor.STATE; // <-- This doesn't work 
     Assert.AreEqual(Started, actorsCurrentState); 
    } 

UPDATE

與從tomliversidge了答案:我reaso編寫這個單元測試是學術性的,但事實上,這不是一個好的單元測試,這就是爲什麼你不能按照我所希望的那樣做。來自Petabridge's Unit Testing Guide

實際上,如果一個演員想要知道另一個演員的內部狀態,那麼它必須向該演員發送一條消息。我建議你在測試中遵循相同的模式,並且不要濫用TestActorRef。堅持您的應用程序中實際使用的測試中的消息傳遞模型。

回答

2

你會通過消息傳遞來正常測試。例如,您在啓動狀態下處理哪些消息?我假設您的示例已簡化爲Started中的Console.WriteLine操作。

如果您發送StartMessage,然後發送處於Started狀態的第二條消息,則可以對此第二條消息的響應進行斷言。

作爲一個簡單的建議:

private void Started() 
{ 
    Receive<StartMessage>(msg => { 
     Sender.Tell(new AlreadyStarted()); 
    } 
} 

如果StartMessage處於啓動狀態接收,同時,可以再斷言上接收AlreadyStarted消息。

欲瞭解更多信息請查看文章Petabridge https://petabridge.com/blog/how-to-unit-test-akkadotnet-actors-akka-testkit/

+0

我讀過Petebridge的單元測試指南前後幾次現在:-)我會從它的一些空話來更新我的問題,支持你回答。我希望能有一個不同的答案,但我認爲你已經證實,你正在編寫像這樣的單元測試的場景可能表示代碼味道 – Elliott

+0

是最好堅持黑盒消息傳遞:) – tomliversidge

相關問題