Próbuję przetestować moich aktorów Akka.NET, ale mam problemy z testKit i zrozumienie, jak to działa.Jak używać TestKit w Akka.NET
Ponieważ nie ma oficjalnej dokumentacji testów jednostkowych w Akka.NET, zbadałem przykład kodu repozytorium Akka.NET, ale przykłady tam zastosowane nie działają dla mnie.
Testy, których użyłem do odniesienia to ReceiveActorTests.cs i ReceiveActorTests_Become.cs, ponieważ są blisko scenariusza, który próbuję przetestować w mojej aplikacji.
Oto niektóre atrapa kodu:
Biorąc pod uwagę ten aktor
public class Greeter : ReceiveActor
{
public Greeter()
{
NotGreeted();
}
private void NotGreeted()
{
Receive<Greeting>(msg => Handle(msg));
}
private void Greeted()
{
Receive<Farewell>(msg => Handle(msg));
}
private void Handle(Greeting msg)
{
if (msg.Message == "hello")
{
Become(Greeted);
}
}
private void Handle(Farewell msg)
{
if (msg.Message == "bye bye")
{
Become(NotGreeted);
}
}
}
Chcę przetestować że Odbiera powitania i komunikaty Farewell poprawnie i przejdzie poprawnie Zostań członkowskich. Patrząc na testach ReceiveActorTests_Become.cs, aktorem jest tworzony przez
var system = ActorSystem.Create("test");
var actor = system.ActorOf<BecomeActor>("become");
i wiadomość jest wysyłana i zapewnił o
actor.Tell(message, TestActor);
ExpectMsg(message);
jednak, gdy próbuję to podejście do instancji aktorem, i wielu innych na podstawie metody TestKit (patrz niżej), trzymam uzyskiwanie Samme udało błąd badawczej:
Xunit.Sdk.TrueExceptionFailed: Timeout 00:00:03 while waiting for a message of type ConsoleApplication1.Greeting
Expected: True
Actual: False
To jest mój testu:
public class XUnit_GreeterTests : TestKit
{
[Fact]
public void BecomesGreeted()
{
//var system = ActorSystem.Create("test-system"); // Timeout error
//var actor = system.ActorOf<Greeter>("greeter"); // Timeout error
//var actor = ActorOfAsTestActorRef<Greeter>("greeter"); // Timeout error
//var actor = ActorOf(() => new Greeter(), "greeter"); // Timeout error
//var actor = Sys.ActorOf<Greeter>("greeter"); // Timeout error
//var actor = Sys.ActorOf(Props.Create<Greeter>(), "greeter"); // Timeout error
var actor = CreateTestActor("greeter"); // Works, but doesn't test my Greeter actor, but rather creates a generic TestActor (as I understand it)
var message = new Greeting("hello");
actor.Tell(message, TestActor);
ExpectMsg(message);
}
}
Próbowałem również przesuwać linię ExpectMsg powyżej linii actor.Tell (ponieważ bardziej sensowne było oczekiwanie czegoś, zanim zaczniesz działać i raczej zweryfikowanie oczekiwań po), ale powoduje to również błąd Timeout .
Próbowałem już z testami NUnit i XUnit.
Prawdopodobnie jest coś bardzo podstawowego, czego nie zauważyłem.
Być może zainteresuje Cię to głębokie wprowadzenie do TestKit i jak z niego korzystać. Prekursor do długo zaległych dokumentów na ten temat, który powinien zostać opublikowany w przyszłym tygodniu >> https://petabridge.com/blog/akka-testkit-introduction/ (ujawnienie: napisałem) – AndrewS