Akka的TestProbe expectMsg匹配,如果预期的消息是发送的

时间:2015-04-01 11:39:30

标签: akka akka-testkit

我对特定演员进行了测试。这个actor依赖于其他一些actor,所以我使用TestProbe()进行单独测试。 我的问题是,我收到更多消息,然后我有兴趣在这个非常特殊的测试中进行测试。例如:

val a = TestProbe()
val b = TestProbe()
val actor = TestActorRef(new MyActor(a.ref, b.ref))

actor ! Message(1, 2)

b.expectMsg(3)

测试失败,因为在创建MyActor时,它会发送某种"注册"在构造函数中传递的消息。

消息3最终到达,但断言失败 - 这不是第一个到达的消息。 我想避免断言多于我测试所需的消息 - 这些消息可以改变,等等,它不是特定测试的范围。

由于TestProbe不包含此类方法 - 我怀疑我的测试设置可能有问题(或者更确切地说是我的项目架构)。我看到有很多方法,比如fishForMessage,但是所有这些方法都需要一个明确的时间参数,这似乎无关紧要,因为我的整个测试纯粹是同步的。

有没有办法完成这样的测试是希望的消息只是在所有被收到的?如果没有,我的设置如何改进以便于测试?

1 个答案:

答案 0 :(得分:0)

fishForMessage实际适合。所有这些断言(包括expectMsg)都是异步expectMsg只使用预配置的timeFactor作为超时。

TestActorRef只保证CallingThreadDispatcher将用于发送消息和执行期货(如果他们使用来自测试演员的调度员),所以他们将按顺序行动直到他们使用{{1} }}。没有什么能阻止context.dispatcher内的某些代码使用另一个调度程序发送响应,因此所有检查仍然应该是异步的 - 你只是无法摆脱它。