Akka TestKit 探针的严格模式
Strict mode for Akka TestKit probes
我正在为基于参与者的应用程序编写测试用例。其中一个组件可以大致定义如下:
class MyActor(a: ActorRef, b: ActorRef) extends Actor {
override def receive: Receive = {
case _ =>
a ! "Got message!"
b ! "Hello!"
}
}
现在,我正在使用 akka-testkit
和 TestProbe
编写测试用例。测试用例的重要部分如下所示:
val a = TestProbe()
val b = TestProbe()
val c = system.actorOf(Props(new MyActor(a.testActor, b.testActor)))
c ! "Message!"
a.expectMsg("Got message!")
现在的问题是测试用例通过了,即使发送到 b
的消息不是预期的,因此没有经过验证。
我知道我可以在测试用例的开头调用 b.expectNoMsg()
来解决这个特定问题,但不知何故我相信这不是一个真正可扩展的方法(我必须每次在所有预期调用之后添加它,这非常麻烦)。
所以我的问题是:在严格模式下是否有 运行 akka-testkit
的选项,以便每条消息都必须以某种方式预期?更好的方法是通过 TestKit
、ActorSystem
或 TestProbe
配置,但任何不需要修改每个测试用例的解决方案都可以(因此在每次通信结束时调用 expectNoMsg()
不是解决方案)
对于测试失败的东西,它必须抛出执行测试的某种线程的断言错误,但由于探测是异步的,您放入它的任何故障检测都将在不同的线程上发生,因此需要有一个地方可以让您从测试中调用方法(就像 expectNoMsg()
)。
话虽这么说,您仍然可以对该概念进行抽象,例如挂钩到您的测试工具包中。
一种可能的方法是使用高阶函数:
def failOnUnexpectedMessage[T](test: ActorRef => T): T = {
val probe = TestProbe()
val result = test(probe.ref)
probe.expectNoMsg()
result
}
然后您可以在测试中使用它(此处为最高级的单词规范样式):
"My actor" should {
"something something" in failOnUnexpectedMessage { ref =>
val actor = ...construct and pass it ref as b...
...rest of the test...
}
}
我正在为基于参与者的应用程序编写测试用例。其中一个组件可以大致定义如下:
class MyActor(a: ActorRef, b: ActorRef) extends Actor {
override def receive: Receive = {
case _ =>
a ! "Got message!"
b ! "Hello!"
}
}
现在,我正在使用 akka-testkit
和 TestProbe
编写测试用例。测试用例的重要部分如下所示:
val a = TestProbe()
val b = TestProbe()
val c = system.actorOf(Props(new MyActor(a.testActor, b.testActor)))
c ! "Message!"
a.expectMsg("Got message!")
现在的问题是测试用例通过了,即使发送到 b
的消息不是预期的,因此没有经过验证。
我知道我可以在测试用例的开头调用 b.expectNoMsg()
来解决这个特定问题,但不知何故我相信这不是一个真正可扩展的方法(我必须每次在所有预期调用之后添加它,这非常麻烦)。
所以我的问题是:在严格模式下是否有 运行 akka-testkit
的选项,以便每条消息都必须以某种方式预期?更好的方法是通过 TestKit
、ActorSystem
或 TestProbe
配置,但任何不需要修改每个测试用例的解决方案都可以(因此在每次通信结束时调用 expectNoMsg()
不是解决方案)
对于测试失败的东西,它必须抛出执行测试的某种线程的断言错误,但由于探测是异步的,您放入它的任何故障检测都将在不同的线程上发生,因此需要有一个地方可以让您从测试中调用方法(就像 expectNoMsg()
)。
话虽这么说,您仍然可以对该概念进行抽象,例如挂钩到您的测试工具包中。
一种可能的方法是使用高阶函数:
def failOnUnexpectedMessage[T](test: ActorRef => T): T = {
val probe = TestProbe()
val result = test(probe.ref)
probe.expectNoMsg()
result
}
然后您可以在测试中使用它(此处为最高级的单词规范样式):
"My actor" should {
"something something" in failOnUnexpectedMessage { ref =>
val actor = ...construct and pass it ref as b...
...rest of the test...
}
}