- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试测试我的 Akka.NET actors,但在使用 TestKit 和理解它的工作原理时遇到了一些问题。
由于 Akka.NET 中还没有关于单元测试的官方文档,我已经探索了 Akka.NET 存储库以获取示例代码,但那里使用的示例对我不起作用。
我引用的测试是ReceiveActorTests.cs和 ReceiveActorTests_Become.cs ,因为这些与我尝试在我的应用中测试的场景很接近。
这是一些伪代码:
给定这个 Actor
public class Greeter : ReceiveActor
{
public Greeter()
{
NotGreeted();
}
private void NotGreeted()
{
Receive<Greeting>(msg => Handle(msg));
}
private void Greeted()
{
Receive<Farewell>(msg => Handle(msg));
}
private void Handle(Greeting msg)
{
if (msg.Message == "hello")
{
Become(Greeted);
}
}
private void Handle(Farewell msg)
{
if (msg.Message == "bye bye")
{
Become(NotGreeted);
}
}
}
我想测试它是否正确接收了 Greeting 和 Farewell 消息,并正确进入 Become-states。看着 ReceiveActorTests_Become.cs测试,一个 Actor 是由
var system = ActorSystem.Create("test");
var actor = system.ActorOf<BecomeActor>("become");
消息由
发送并断言actor.Tell(message, TestActor);
ExpectMsg(message);
但是,当我尝试使用这种方法来实例化一个 actor 以及许多其他基于 TestKit 方法(见下文)的方法时,我不断收到相同的测试失败错误:
Xunit.Sdk.TrueExceptionFailed: Timeout 00:00:03 while waiting for a message of type ConsoleApplication1.Greeting
Expected: True
Actual: False
这是我的测试:
public class XUnit_GreeterTests : TestKit
{
[Fact]
public void BecomesGreeted()
{
//var system = ActorSystem.Create("test-system"); // Timeout error
//var actor = system.ActorOf<Greeter>("greeter"); // Timeout error
//var actor = ActorOfAsTestActorRef<Greeter>("greeter"); // Timeout error
//var actor = ActorOf(() => new Greeter(), "greeter"); // Timeout error
//var actor = Sys.ActorOf<Greeter>("greeter"); // Timeout error
//var actor = Sys.ActorOf(Props.Create<Greeter>(), "greeter"); // Timeout error
var actor = CreateTestActor("greeter"); // Works, but doesn't test my Greeter actor, but rather creates a generic TestActor (as I understand it)
var message = new Greeting("hello");
actor.Tell(message, TestActor);
ExpectMsg(message);
}
}
我还尝试将 ExpectMsg 行移动到 actor.Tell 行上方(因为在你对它采取行动之前进行预期更有意义,而不是在之后验证预期),但这也会导致超时错误。
我尝试过使用 NUnit 和 XUnit TestKits。
我可能忽略了一些非常基本的东西。
最佳答案
TestKit 用于更多的行为测试,以验证您的 actor 在整个 actor 系统的上下文中是否按预期工作。这更像是黑盒测试——您不会直接触及 Actor 的内部。相反,最好将注意力集中在诸如给定信号 A 和参与者行为 B 之类的行为上,它应该向另一个参与者 D 发送消息 C。
在您的示例中,Greeter
actor 的问题在于它是静音的 - 虽然它可以接收一些输入,但它不会做任何结果。从整个系统的角度来看,它可能已经死了,没人会在意。
使用其他示例 - 给定以下 Actor :
public class Greeter : ReceiveActor
{
public Greeter()
{
Receive<Greet>(greet =>
{
// when message arrives, we publish it on the event stream
// and send response back to sender
Context.System.EventStream.Publish(greet.Who + " sends greetings");
Sender.Tell(new GreetBack(Self.Path.Name));
});
}
}
让我们创建一个示例测试规范:
public class GreeterSpec : TestKit
{
private IActorRef greeter;
public GreeterSpec() : base()
{
greeter = Sys.ActorOf<Greeter>("TestGreeter");
}
[Fact]
public void Greeter_should_GreetBack_when_Greeted()
{
// set test actor as message sender
greeter.Tell(new Greet("John Snow"), TestActor);
// ExpectMsg tracks messages received by TestActors
ExpectMsg<GreetBack>(msg => msg.Who == "TestGreeter");
}
[Fact]
public void Greeter_should_broadcast_incoming_greetings()
{
// create test probe and subscribe it to the event bus
var subscriber = CreateTestProbe();
Sys.EventStream.Subscribe(subscriber.Ref, typeof (string));
greeter.Tell(new Greet("John Snow"), TestActor);
// check if subscriber received a message
subscriber.ExpectMsg<string>("John Snow sends greetings");
}
}
如您所见,这里我不检查 actor 的内部状态。相反,我正在观察它如何对我发送给它的信号使用react,并验证它是否是预期结果。
关于c# - 如何在 Akka.NET 中使用 TestKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30730706/
我正在尝试记录TestKit TestProbe收到的所有消息,事实证明这有些困难。我知道文档中的Actor Logging部分,其中说应该将debug.receive选项与LogginReceive
我在同一个类中有一系列测试都测试相同的功能,我如何跳过/忽略单个测试,例如: class FooTest(_system: ActorSystem) extends TestKit(_system)
我正在使用 Akka testkit 库来测试我的几个 Actor 。 这是我的 build.sbt 中的内容: "com.typesafe.akka" %% "akka-testkit" % "2.
为 TestProbe.expectNoMsg() 设置默认超时的正确方法是什么?在代码中不在配置中? 我知道我可以定义 akka.test.single-expect-default在 applic
我从 http://doc.akka.io/docs/akka/snapshot/scala/testing.html#Using_Multiple_Probe_Actors 扩展了示例. impor
我正在尝试将Gradle TestKit与JaCoCo集成。我正在使用这个插件 https://github.com/koral--/jacoco-gradle-testkit-plugin 这会创建
我正在尝试使用 Akka 的 TestKit 制作 specs2 测试。我被一个持续的编译错误困住了,我不知道如何解决,我很感激建议。 编译错误是: TaskSpec.scala:40: parent
我一直在尝试在我的 scalaTest 中这样记录事情: class ChangeSetActorTest extends PersistenceSpec(ActorSystem("Persisten
根据docs ,在(预期日志消息)下, Be sure to exchange the default logger with the TestEventListener in your applic
在这个例子中: http://doc.akka.io/docs/akka/snapshot/java/testing.html final Props props = Props.create(MyA
我正在使用 TestKit 测试我正在从事的涉及 Akka Actors 的 Scala 项目的一些类,我遇到了这个问题: 一个或多个请求的类不是套件:poc.PocConstituentsWatch
我对一个 actor 进行了测试,该 actor 可能会响应一些意外消息,但最终它必须响应特定的已知消息。所以本质上我想要一个断言,它会在某个时间跨度内忽略其他消息,但期待一个已知消息,就像这样:
我正在尝试测试我的 Akka.NET actors,但在使用 TestKit 和理解它的工作原理时遇到了一些问题。 由于 Akka.NET 中还没有关于单元测试的官方文档,我已经探索了 Akka.NE
我有一个 Akka Actor,它使用 Ask 模式从子 Actor 检索 Future 并对成功和失败采取行动。我不知道如何模拟 child Actor 并以失败作为回应。 这是代码: import
鉴于我有一个注入(inject)了 child actor 的 Supervisor actor,我该如何向 child 发送 PoisonPill 消息并使用 TestKit 对其进行测试? 这是我
自从将 Gradle 升级到版本 6 后,我注意到与我使用 TestKit 实现的功能测试相关的新警告。我很清楚如何摆脱它们。不清楚的是它们为什么首先出现,以及它们在功能测试的上下文中有何相关性。 这
Java 8 和 Akka (Java API) 2.12:2.5.16 在这里。我收到以下消息: public class SomeMessage { private int another
对akka Actor 来说有点新意 但希望了解 TestKit 、 TastActorRef 和 TestProbe 之间的用途和区别 在akka单元测试中使用。 我已经看到它们用于单元测试 akk
在我的 Scala 应用程序中,假设我有 Actor A 和 Actor B。我想在 ScalaTest 中设计一个测试用例,它允许我向 Actor A 发送消息,并查看它向 Actor B 发送什么
我正在对使用集群工具的参与者进行单元测试 DistributedPubSub .对于测试,我使用 Akka.net 的 TestKit。 显然,在 TestKit 中,系统参与者 Sys没有 Dist
我是一名优秀的程序员,十分优秀!