我正在尝试测试我的 Akka.NET Actor,但在使用 TestKit 和理解它的工作原理时遇到了一些问题。
由于 Akka.NET 中还没有关于单元测试的官方文档,我已经探索了 Akka.NET 存储库中的示例代码,但那里使用的示例对我来说不起作用。
我用来参考的测试是ReceiveActorTests.cs https://github.com/akkadotnet/akka.net/blob/ce561dd51755e0b46f429d092691e494232fb811/src/core/Akka.Tests/Actor/ReceiveActorTests.cs and ReceiveActorTests_Become.cs https://github.com/akkadotnet/akka.net/blob/ce561dd51755e0b46f429d092691e494232fb811/src/core/Akka.Tests/Actor/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);
}
}
}
我想测试它是否正确接收问候和告别消息,并正确进入成为状态。看着ReceiveActorTests_Become.cs https://github.com/akkadotnet/akka.net/blob/ce561dd51755e0b46f429d092691e494232fb811/src/core/Akka.Tests/Actor/ReceiveActorTests_Become.cs测试,演员是由
var system = ActorSystem.Create("test");
var actor = system.ActorOf<BecomeActor>("become");
并且消息被发送并断言
actor.Tell(message, TestActor);
ExpectMsg(message);
然而,当我尝试用这种方法来实例化一个 Actor 以及许多其他基于 TestKit 方法的方法(见下文)时,我不断收到相同的失败测试错误:
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 行上方(因为在执行操作之前期望某些内容,然后验证期望更有意义),但这也会导致超时错误。
我尝试过 NUnit 和 XUnit TestKits。
可能有一些非常基本的东西我忽略了。