2015-04-01 61 views
0

我有一个特定的演员测试。这个演员依赖于其他一些演员,所以我使用TestProbe()进行单独测试。 我的问题是,我收到更多的消息,然后我有兴趣在这个非常特殊的测试测试。例如:Akka的TestProbe expectMsg匹配,如果期望的消息之间发送

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

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

TestActorRef保证你只CallingThreadDispatcher将用于发送邮件,并执行期货(如果他们使用调度员从测试的演员),所以直到他们使用context.dispatcher他们将采取行动顺序。没有什么可以阻止你的MyActor中的一些代码使用另一个调度器发送响应,所以所有的检查仍然应该是异步的 - 你不能摆脱这种情况。