我对特定演员进行了测试。这个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
,但是所有这些方法都需要一个明确的时间参数,这似乎无关紧要,因为我的整个测试纯粹是同步的。
有没有办法完成这样的测试是希望的消息只是在所有被收到的?如果没有,我的设置如何改进以便于测试?
答案 0 :(得分:0)
fishForMessage
实际适合。所有这些断言(包括expectMsg
)都是异步。 expectMsg
只使用预配置的timeFactor作为超时。
TestActorRef
只保证CallingThreadDispatcher
将用于发送消息和执行期货(如果他们使用来自测试演员的调度员),所以他们将按顺序行动直到他们使用{{1} }}。没有什么能阻止context.dispatcher
内的某些代码使用另一个调度程序发送响应,因此所有检查仍然应该是异步的 - 你只是无法摆脱它。