我已经重构了一个播放应用程序中的大量电子邮件发送代码,以使用actor异步执行此操作。
[当我需要发送电子邮件时,我现在注入了EmailActor
,然后打电话给emailActor ? EmailRequest(from, to, ...)
发送。
我的问题是,我该如何对实际被称为演员的单元进行单元测试?
[我阅读了Akka关于测试的文档,但是在我看来,它专注于测试actor本身,而不是测试他们的调用,并且也不清楚我应该从哪里开始。
您可以使用TestProbe
并将其注入您的电子邮件服务。看看这个简单的测试用例
TestProbe
[请注意,如果您使用
import akka.actor.{ActorRef, ActorSystem}
import akka.pattern.ask
import akka.testkit.{TestKit, TestProbe}
import akka.util.Timeout
import org.scalatest.flatspec.AsyncFlatSpecLike
import scala.concurrent.Future
import scala.concurrent.duration._
class TestProbeActorExample
extends TestKit(ActorSystem("test"))
with AsyncFlatSpecLike {
class MyService(actorRef: ActorRef) {
def sendEmail(email: String): Future[Int] = {
implicit val timeout: Timeout = 1.second
(actorRef ? email).mapTo[Int]
}
}
it should "test an actor" in {
val testProbe = TestProbe()
val service = new MyService(testProbe.ref)
val statusCode = service.sendEmail("email")
testProbe.expectMsg("email")
testProbe.reply(10)
statusCode.map(r => assert(r == 10))
}
}
模式,则需要断言已用ask
接收到消息,然后必须用expectMsg
发送回信