测试Spray路径:为什么我需要定义一个actorRefFactory:ActorSystem?

时间:2014-12-03 11:36:17

标签: akka scalatest spray

我有一个用于检查Web服务的测试代码,一些继承的类引入HttpService(不确定,哪一个),要求我定义actorRefFactory引用在测试班内。

有更好的方法吗?

Scala 2.11.4,ScalaTest 2.2.1,Spray 1.3.2,Akka 2.3.6

class RestAPITest extends FlatSpec
  with Matchers
  with ScalatestRouteTest
  with SprayJsonSupport
  with MyRoute
{
  // Without this, we get:
  // <<
  //    Error:(48, 7) class RestAPITest needs to be abstract, since method actorRefFactory in trait HttpService of type => akka.actor.ActorRefFactory is not defined
  // <<
  //
  def actorRefFactory: ActorSystem = system

  ...

2 个答案:

答案 0 :(得分:1)

由于它基于Akka actor,因此喷雾需要actorSystem。喷雾的惯用测试机制是使用spray-testkit项目。

来自spray-testkit文档:

使用spray-testkit构建的测试的基本结构是这样的(全部大写的表达式占位符):

REQUEST ~> ROUTE ~> check {
  ASSERTIONS
}

在此模板中,REQUEST是一个评估HttpRequest实例的表达式。由于两个RouteTest特性都扩展了spray-httpx Request Building特性,因此您可以访问其mini-DSL,以便于简洁的请求构建。

ROUTE是评估喷雾路线的表达式。您可以指定一个内联或只是引用服务中定义的路径结构。

〜&gt;的最后一个元素chain是一个检查调用,它将一个断言块作为参数。在此块中,您可以在处理完给定请求后,将您的需求定义为路径生成的结果。通常,您使用其中一个已定义的“检查器”来检索路由响应的特定元素,并使用测试框架提供的测试DSL表达对它的断言。例如,使用specs2,为了验证您的路由是否响应状态为200的响应的请求,您将使用状态检查器并表达如下断言:

status mustEqual 200

答案 1 :(得分:-3)

正如错误所说,你需要一个actorRefFactory让actor在HTTP服务中产生。所以请继续。