Let's say I would like to test OnTermination logic in my FSM. What would be the proper way to do that? Em I doing it right in my second test? Why is my first test failing, even though entering OnTermination code and sending message to the parent actor.
public class FsmTests : TestKit
{
[Fact]
public void NotWorkingTest()
{
var fsmActorRef = ActorOfAsTestActorRef<FsmActor>(Props.Create(() => new FsmActor()), TestActor);
fsmActorRef.Tell(new ExampleEvent());
ExpectMsg("termination");
}
[Fact]
public void WorkingTest()
{
var fsmActorRef = ActorOfAsTestActorRef<FsmActor>(Props.Create(() => new FsmActor()), TestActor);
fsmActorRef.Tell(PoisonPill.Instance);
ExpectMsg("termination");
}
}
public enum State
{
Idle,
Active
}
public interface IData { }
public class Uninitialized : IData
{
public static Uninitialized Instance = new Uninitialized();
private Uninitialized() { }
}
public class ExampleEvent { }
public class FsmActor : FSM<State, IData>
{
public FsmActor()
{
StartWith(State.Idle, Uninitialized.Instance);
When(State.Idle, state =>
{
if (state.FsmEvent is ExampleEvent ex && state.StateData is Uninitialized)
{
return GoTo(State.Done);
}
return null;
});
Initialize();
OnTermination(termination =>
{
Context.Parent.Tell("termination");
});
}
}