0

我正在使用 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 for some path [WARNING][16/11/2015 18:46:37][Thread 0012][akka://test/user] DeadLetter from [akka://test/user] to [akka:/ /test/user]: : [akka://test/user/$b], ExistenceConfirmed=True, AddressTerminated=False>

4

2 回答 2

2

你误解了哪个演员是主题ExpectMsg()ExpectMsg调用正在被调用,TestActor它是TestKit测试中所有消息的默认/隐式发送者。

所以错误是因为你告诉TestKit应该TestActor期望ZipMessage. 明确地说,正如所写的那样,TestActor应该得到一个ZipMessage. 这并不是说ZipActor应该得到那个信息。您要达到的超时是TestActor应用于其ExpectMsg调用的默认 :03 超时。

要使测试按照现在的设置通过,您需要Sender.Tell(new ZipMessage("foopath"))ZipActor.

公平地说,目前缺少项目文档TestKit(截至 2015 年 11 月 16 日)。我们现在正在编写它们,它们应该会在下周发布。

现在我建议你看看这个对 TestKit 的全面介绍(披露:我写的)。我认为这将使您对TestKit实际工作方式有一个非常深入的了解。

于 2015-11-17T01:32:12.573 回答
0

好的,所以我在这里搞错了,当我实际添加我错过的 HandleZipMessage 的结束行时,这是有道理的。我的测试实际上类似于这篇文章 -使用 TestKit 测试 Akka.NET 的 Context.Parent。所以我需要做的是这个,它有效。:)

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>();
    }
}
于 2015-11-17T12:45:43.287 回答