要测试OnTermination过渡,可以使用在测试类中扩展TestFSMRef实例的OnTermination方法的方式。例如,假设有一个FSM Actor定义如下:
public class MyFsmActor : FSM
{
public MyFsmActor()
{
StartWith(MyFsmActorState.Idle, Uninitialized);
When(MyFsmActorState.Idle, @event =>
{
if (@event.FsmEvent.Equals("start"))
{
Console.WriteLine("Starting...");
return GoTo(MyFsmActorState.Active);
}
return null;
});
When(MyFsmActorState.Active, @event =>
{
if (@event.FsmEvent.Equals("ping"))
{
Console.WriteLine("Pong");
return null;
}
if (@event.FsmEvent.Equals("stop"))
{
Console.WriteLine("Stopping...");
return GoTo(MyFsmActorState.Idle);
}
return null;
});
OnTransition((state, nextState) =>
{
Console.WriteLine($"Transitioning from {state} to {nextState}");
});
OnTermination(state =>
{
Console.WriteLine($"Terminating {state}");
});
Initialize();
}
}
public enum MyFsmActorState
{
Idle,
Active
}
要测试OnTermination过渡,可以考虑以下测试代码:
[TestClass]
public class MyFsmActorTest
{
[TestMethod]
public void Test_OnTermination()
{
var fsmRef = ActorOfAsTestActorRef();
fsmRef.Tell("start");
fsmRef.Tell("ping");
fsmRef.OnTermination(state =>
{
Assert.AreEqual(MyFsmActorState.Active, state);
});
fsmRef.Tell(PoisonPill.Instance);
var isTerminated = fsmRef.WaitUntilTerminated(TimeSpan.FromSeconds(5));
Assert.IsTrue(isTerminated);
}
}
该测试代码中,我们创建了一个TestActorRef实例,并使用Tell方法模拟了一些有状态的消息传递。然后,我们扩展了TestActorRef实例的