Akka.NET TestKit 出现超时错误

Akka.NET TestKit getting timeout error

我正在使用 NUnit 进行测试。我做错了什么?

public class ZipActor : ReceiveActor
{
    public ZipActor()
    {
        Receive<ZipMessage>(message => HandleZipMessage(message));
    }

    private void HandleZipMessage(ZipMessage message)
    {
        Console.WriteLine(string.Format("Received: {0} for {1}", typeof(ZipMessage).Name, message.SourceFolderPath));
    }
}

public class ZipMessage
{
    public readonly string SourceFolderPath;

    public ZipMessage(string sourceFolderPath)
    {
        SourceFolderPath = sourceFolderPath;
    }
}

[TestFixture]
public class ZipActorTests : TestKit
{
    [Test]
    public void ZipActor_WhenSentZipMessage_ShouldReceiveZipMessage()
    {
        var actor = Sys.ActorOf(Props.Create(() => new ZipActor()));
        string path = "some path";

        actor.Tell(new ZipMessage(path));

        ExpectMsg<ZipMessage>();
    }
}

我收到这个错误:

失败:等待 CloudBackupActors.Messages.ZipMessage 类型的消息时超时 00:00:03

这是我在 NUnit 的控制台输出中得到的。 已收到:某些路径的 ZipMessage [警告][16/11/2015 18:46:37][线程 0012][akka://test/user] 死信从 [akka://test/user] 到 [akka://test/user]: : [akka://test/user/$b], ExistenceConfirmed=True, AddressTerminated=False>

您误解了 ExpectMsg() 的主题是哪个演员。 ExpectMsg 呼叫正在 TestActor 上调用,TestActorTestKit 测试中所有消息的 default/implicit 发件人。

所以错误是因为你告诉 TestKit TestActor 应该期待 ZipMessage。明确地说,如所写,是说 TestActor 应该得到 ZipMessage。这并不是说 ZipActor 应该收到该消息。您遇到的超时是 TestActor 应用于其 ExpectMsg 调用的默认 :03 超时。

要使测试通过现在的设置,您需要从 ZipActor.

内部 Sender.Tell(new ZipMessage("foopath"))

平心而论,TestKit 的项目文档目前缺失(截至 2015 年 11 月 16 日)。我们现在正在编写它们,它们应该会在下周发布。

现在我建议您查看 this thorough intro to the TestKit(披露:我写的)。我认为它会让您对 TestKit 的实际工作原理有一个非常扎实的理解。

好吧,所以我在这里弄错了,当我实际添加我错过的 HandleZipMessage 的结束行时,这是有道理的。我的测试实际上类似于此 post - 。所以我需要做的就是这个,它有效。 :)

public class ZipActor : ReceiveActor
{
    public ZipActor()
    {
        Receive<ZipMessage>(message => HandleZipMessage(message));
    }

    private void HandleZipMessage(ZipMessage message)
    {
        Console.WriteLine(string.Format("Received: {0} for {1}", typeof(ZipMessage).Name, message.SourceFolderPath));
        // TODO: Zip operations
        Context.Parent.Tell(new IncrementFolderCountMessage());
    }
}

public class ZipMessage
{
    public readonly string SourceFolderPath;

    public ZipMessage(string sourceFolderPath)
    {
        SourceFolderPath = sourceFolderPath;
    }
}

[TestFixture]
public class ZipActorTests : TestKit
{
    [Test]
    public void ZipActor_WhenReceivedZip_ShouldIncrementFolderCount()
    {
        // Arrange
        // (make ZipActor child of TestActor)
        var props = Props.Create(() => new ZipActor());
        var actor = ActorOfAsTestActorRef<ZipActor>(props, TestActor);

        string path = "some path";

        // Act
        actor.Tell(new ZipMessage(path));

        // Assert
        ExpectMsg<IncrementFolderCountMessage>();
    }
}