测试期望消息的模式匹配

时间:2014-08-13 13:30:01

标签: scala akka

如果我不知道所有消息详细信息,如何使用akka testkit测试预期消息?我能以某种方式使用下划线" _"?

示例我可以测试:

echoActor ! "hello world"
expectMsg("hello world")

示例我想测试

case class EchoWithRandom(msg: String, random: Int)

echoWithRandomActor ! "hi again"
expectMsg(EchoWithRandom("hi again", _))

我不想使用的方式:

echoWithRandomActor ! "hi again"
val msg = receiveOne(1.second)
msg match {
    case EchoWithRandom("hi again", _) => //ok
    case _ => fail("something wrong")
}

1 个答案:

答案 0 :(得分:28)

看起来你可以做很多事情,因为expectMsg使用== behind the scenes

您可以尝试使用expectMsgPF,其中PF来自PartialFunction

echoWithRandomActor ! "hi again"
expectMsgPF() {
  case EchoWithRandom("hi again", _) => ()
}

更新

在最新版本(目前为2.5.x)中,您需要TestProbe

您还可以从expectMsgPF返回一个对象。它可能是您与模式匹配的对象或其中的一部分。这样,您可以在expectMsgPF成功返回后进一步检查。

import akka.testkit.TestProbe

val probe = TestProbe()

echoWithRandomActor ! "hi again"

val expectedMessage = testProbe.expectMsgPF() { 
    // pattern matching only
    case ok@EchoWithRandom("hi again", _) => ok 
    // assertion and pattern matching at the same time
    case ok@EchoWithRandom("also acceptable", r) if r > 0 => ok
}

// more assertions and inspections on expectedMessage

有关详细信息,请参阅Akka Testing