Я пытаюсь протестировать своих аккордов Akka.NET, но испытываю определенные проблемы с TestKit и понимая, как это работает.
Поскольку в Akka.NET пока нет официальной документации для модульного тестирования, я изучил репозиторий Akka.NET, например, код, но используемые здесь примеры не работают.
Те тесты, которые я использовал для справки, ReceiveActorTests.cs и ReceiveActorTests_Become.cs, поскольку эти близки к сценарию, который я пытаюсь проверить в своем приложении.
Вот какой фиктивный код:
Учитывая этот актер
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);
}
}
}
Я хочу проверить, что он правильно получает приветствие и прощание, и правильно вводит состояния Become. Глядя на тесты ReceiveActorTests_Become.cs, актер создается
var system = ActorSystem.Create("test");
var actor = system.ActorOf<BecomeActor>("become");
и сообщение отправлено и подтверждено
actor.Tell(message, TestActor);
ExpectMsg(message);
Однако, когда я пытаюсь использовать этот подход для создания экземпляра актера и многих других, основанных на методах TestKit (см. ниже), я продолжаю получать ошибку теста samme:
Xunit.Sdk.TrueExceptionFailed: Timeout 00:00:03 while waiting for a message of type ConsoleApplication1.Greeting
Expected: True
Actual: False
Это мой тест:
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);
}
}
Я также попытался переместить строку ExpectMsg над линией actor.Tell(поскольку для вас было больше смысла ожидать чего-то до того, как вы начнете действовать, и скорее проверите ожидание после), но это также приводит к ошибке Timeout.
Я пробовал как с NUnit, так и с XUnit TestKits.
Возможно, что-то действительно основное, что я забыл.