使用 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!");
}
}
}
我有一个 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!");
}
}
}