我有一個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。堅持您的應用程序中實際使用的測試中的消息傳遞模型。
我讀過Petebridge的單元測試指南前後幾次現在:-)我會從它的一些空話來更新我的問題,支持你回答。我希望能有一個不同的答案,但我認爲你已經證實,你正在編寫像這樣的單元測試的場景可能表示代碼味道 – Elliott
是最好堅持黑盒消息傳遞:) – tomliversidge