【问题标题】:Testing Akka.NET's Context.Parent with TestKit使用 TestKit 测试 Akka.NET 的 Context.Parent
【发布时间】:2015-06-17 15:19:11
【问题描述】:

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

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。

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

【问题讨论】:

    标签: c# akka.net


    【解决方案1】:

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

    (为了进一步参考,建议您查看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!");
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      更多模式在这里http://hs.ljungblad.nu/post/69922869833/testing-parent-child-relationships-in-akka让我知道你是否需要一个c# sn-p

      【讨论】:

      • 谢谢,虽然我们不得不捏造这么多,但似乎很遗憾。
      • 是的,这是 akka 提供最简单抽象的原则的一个缺点。不过,如果需要,您可以构建自己的测试框架。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多