使用 TestKit 测试 Akka.NET 的 Context.Parent

Testing Akka.NET's Context.Parent with TestKit

我有一个 actor 通过向它的父级发送消息来响应消息,就像这样...

public void Handle(string message)
{
    Context.Parent.Tell("Hello");
}

我现在想测试消息是否已发送到 Actors Parent,但不知道如何发送。我当前的测试如下所示...

pubilc void AllResponsesWillGoToParent()
{
    ActorOf<MyActor>().Tell("Respond to parent");

    ExpectMsg<string>(x => x == "Hello");
}

这当然行不通,因为 actor 父级是测试 ActorSystem 而不是分配给 TestActor 的 actor 属性。

有谁知道我如何测试消息是否确实发送给了它的父级,谢谢。

解决这个问题的一个方法是创建假的父级,即创建一个您正在测试的真实子 actor。该父节点会将消息从子节点转发到测试探针或 TestActor 本身。

这里有更多模式http://hs.ljungblad.nu/post/69922869833/testing-parent-child-relationships-in-akka如果您需要 c# 代码片段,请告诉我

您可以通过创建您想要的演员作为 TestActorRef,然后将 TestActor 设置为其主管来解决此问题。这使您可以使用 TestActor 的所有内置语义,例如 ExpectMsg<>.

(为了进一步参考,建议您查看 this guide 单元测试 Akka.NET 我写的演员。)

你可以这样做(使用 NUnit):

using System;
using Akka.Actor;
using Akka.TestKit.NUnit;
using NUnit.Framework;

namespace ParentTestExample
{
    public class ParentGreeter : ReceiveActor
    {
        public ParentGreeter()
        {
            Receive<string>(s => string.Equals(s, "greet parent"), s =>
            {
                Context.Parent.Tell("Hello parent!");
            });
        }
    }

    [TestFixture]
    public class ParentGreeterSpecs : TestKit
    {
        [Test]
        public void Parent_greeter_should_greet_parent()
        {
            Props greeterProps = Props.Create(() => new ParentGreeter());
            // make greeter actor as child of TestActor
            var greeter = ActorOfAsTestActorRef<ParentGreeter>(greeterProps, TestActor);
            greeter.Tell("greet parent");

            // TestActor captured any message that came back
            ExpectMsg("Hello parent!");
        }
    }
}