【发布时间】:2016-07-18 20:52:27
【问题描述】:
我有一个 Actor,当它收到 StartMessage 时,它应该使用 Become(Started) 更改状态。如何对 Actor 的状态是否已更改为 Started() 进行单元测试?
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);
}
更新
与 tomliversidge 的回答有关:我编写此单元测试的原因是学术性的,但实际上,这不是一个好的单元测试,这就是为什么您无法按照我希望的那样进行。来自Petabridge's Unit Testing Guide:
实际上,如果一个参与者想知道另一个参与者的内部状态,那么它必须向该参与者发送一条消息。我建议您在测试中遵循相同的模式,不要滥用 TestActorRef。在您的测试中坚持您在应用程序中实际使用的消息传递模型。
【问题讨论】:
标签: unit-testing akka.net