3

我有一个演员通过向其父母发送消息来响应消息,就像这样......

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

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

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

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

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

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

4

2 回答 2

11

你可以通过创建你想要的actor作为一个来解决这个问题TestActorRef,然后将它设置TestActor为它的主管。TestActor这使您可以使用诸如的所有内置语义ExpectMsg<>

(为了进一步参考,建议您查看我编写的关于单元测试 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!");
        }
    }
}
于 2015-11-06T21:10:53.527 回答
0

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

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

于 2015-06-17T20:05:22.820 回答