Testing Akka.NET's Context.Parent with TestKit

谁都会走 提交于 2019-12-13 14:07:09

问题


I have an actor that responds to a message by sending a message to it's parent, like this...

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

I now want to test that the message is sent to the Actors Parent, but can't figure out how. My current test looks like the following...

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

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

This of course doesn't work because the actors parent is the test ActorSystem and not the actor assigned to the TestActor property.

Does anyone know how I can test that the message is indeed sent to it's Parent, thanks.


回答1:


One option to solve this is to create fake parent, that is creating a real child actor that you are testing. This parent will forwarding message from child to a test probe or to TestActor itself.

more patterns here http://hs.ljungblad.nu/post/69922869833/testing-parent-child-relationships-in-akka let me know if you will need a c# snippet




回答2:


You can solve this by creating the actor you want as a TestActorRef, and then setting the TestActor as its supervisor. This lets you use all the built-in semantics of the TestActor such as ExpectMsg<>.

(For further reference, suggest you check out this guide to unit testing Akka.NET actors that I wrote.)

You could do that like so (using 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!");
        }
    }
}


来源:https://stackoverflow.com/questions/30895751/testing-akka-nets-context-parent-with-testkit

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!