0

我对特定演员进行了测试。这个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但所有这些方法都需要一个明确的时间参数,这似乎无关紧要,因为我的整个测试是纯粹同步的。

有没有什么方法可以完成这样的测试,希望的消息只是在所有收到的消息中?如果没有,如何改进我的设置以易于测试?

4

1 回答 1

0

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

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

于 2015-04-01T12:31:01.553 回答