Akka 测试喷洒路线:为什么需要定义ActorRefactory:ActorSystem?

Akka 测试喷洒路线:为什么需要定义ActorRefactory:ActorSystem?,akka,scalatest,spray,Akka,Scalatest,Spray,我有一个用于检查web服务的测试代码,一些继承的类引入了HttpService(不确定是哪一个),要求我在测试类中定义ActorRefactory引用 有更好的方法吗 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 MyRout

我有一个用于检查web服务的测试代码,一些继承的类引入了
HttpService
(不确定是哪一个),要求我在测试类中定义
ActorRefactory
引用

有更好的方法吗

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

  ...
class RestAPITest扩展了FlatSpec
和媒人
用ScalatestRouteTest
使用SprayJsonSupport
用我的路线
{
//没有这一点,我们可以:
//未定义akka.actor.ActorRefactory

//正如错误所说,您需要一个ActorRefactory,才能让actor在HTTP服务中生成。所以请继续。

spray需要actorSystem,因为它基于Akka actors。spray的惯用测试机制是使用spray testkit项目

从文件中:

使用spray testkit构建的测试的基本结构如下(所有caps中的表达式占位符):

在这个模板中,请求是一个对HttpRequest实例求值的表达式。由于两个RouteTest特性都扩展了spray httpx请求构建特性,因此您可以访问它的迷你DSL,以方便简洁地构造请求

ROUTE是计算喷洒路由的表达式。您可以指定一个内联路由,也可以简单地引用服务中定义的路由结构

~>链的最后一个元素是check调用,它将断言块作为参数。在这个块中,您可以在处理给定请求后对路由生成的结果定义您的需求。通常您使用一个定义的“检查器”要检索routes响应的特定元素,并使用测试框架提供的测试DSL对其表示断言。例如,对于specs2,为了验证路由是否使用status 200响应响应请求,您可以使用status inspector并表示如下断言:

status mustEqual 200

谢谢。我不太明白的是,为什么ScalateStroutTest不能提供默认值,因为通常这些事情都是通过Scala中的隐式完成的(对吧?)为什么不在这里?命名一个抽象成员感觉有点不规范。不幸的是,我对这个问题没有一个很好的答案。可能值得联系邮件列表,看看你得到了什么样的答案。可能是spray内部业务使用了另一个actor系统。这会使隐式声明复杂化n因为您将有两个ActorSystem。也可能是作者确定人们通常希望使用自己的ActorSystem进行测试的情况。但是,如果不深入研究代码,很难确定……确实如此。将继续进行。谢谢
status mustEqual 200