如何在测试规范中修复参数ta:TildeArrow的缺失隐式值

时间:2015-02-04 14:47:40

标签: scala routing spray scala-2.9 spray-test

我正在使用喷雾器制作一个简单的测试规范,我无法正确编译,不知道我做错了什么。我的scala版本是2.9.3并且喷涂1.0.1(更新其中任何一个都不是合适的选项)。这是我的测试规范代码:

import org.specs2.mutable.Specification
import spray.testkit.Specs2RouteTest
import spray.http._
import akka.util.Duration
import java.util.concurrent.TimeUnit

import service.MyProxy

abstract class MyTestSpec extends Specification with Specs2RouteTest with MyProxy{

  val duration = Duration(30, TimeUnit.SECONDS)
  implicit val routeTestTimeout = RouteTestTimeout(duration)

  "MyProxy" should {

    "return a json for GET requests to the /api/getclass/classCode path for a regular request" in {
      Get("/api/getclass/123/") ~> myRoutes~> check {
        responseAs[String] must contain("classCode")
        contentType === ContentTypes.`application/json`
      }
    }

  } // end should...
} //end class

我在运行测试时遇到此错误。

[error] C:\Users\Desktop\Project\MyTestSpec.scala:23: could not find implicit value for parameter ta: MyProxySpec.this.TildeArrow[spray.routing.RequestContext,Unit]
[error]       Get("/api/getclass/123/") ~> myRoutes~> check {
[error]                                         ^
[error] one error found
[error] (test:compile) Compilation failed

我尝试过在另一个问题上看到的不同解决方案,到目前为止似乎没有任何效果。

Spray.io: Can't compile test spec

how to make scalatest work with spraytestkit and HttpServiceActor

Basic Spray-Testkit usage to test a route does not work

https://groups.google.com/forum/#!topic/spray-user/H5hkXuDGWYQ

https://groups.google.com/forum/#!topic/spray-user/zFUJSVBPM5c

注意:仅供记录,我没有使用scalatest或scalacheck。纯粹是[喷雾]路线测试。而MyProxy扩展了演员

7 个答案:

答案 0 :(得分:8)

我只是在努力解决这个问题。为了解决这个问题,我浏览了 Akka HTTP codebase ,这是minFreeDiskSpaceLimit s的丛林。

我的问题似乎是,如果没有合适的辅助implicit,则找不到正确的implicit实例。如果查看代码,错误消息中所需的TildeArrow实例在配对对象中被定义为implicit def injectIntoRoute,并且需要一大堆其他TildeArrow个。

我建议你写出你的代码而没有任何隐含的糖。这应该更好地帮助编译器给你一个正确的错误信息:

implicit

我认为原因是因为"MyProxy" should { "return a json for GET requests to the /api/getclass/classCode path for a regular request" in { val request = Get("/api/getclass/123/") val requestWithRoutes = request.~>(myRoutes)(TildeArrow.injectIntoRoute) requestWithRoutes.~>(check { responseAs[String] must contain("classCode") contentType === ContentTypes.`application/json` }) } } 没有可用的具体实例,编译器正在尝试使用implicit和完全未指定的抽象{来满足隐式解析。 {1}},abstract class TildeArrow,未定义type

在我的具体案例中,我错过了一个隐含的ta.Out,无论那意味着什么。

更新

实际上,我进一步调查了一下,问题是我的路线特征中声明了~>,但是trait RouteTest将其名称定义为ExecutionContextExecutor,所以当我定义时我自己完成了缺失的隐含,我最终得到了两个相同的含义。

它是一个可爱的API,但隐含的魔法是失控的,IMO,特别是考虑到错误信息的含义是多么神秘。

答案 1 :(得分:3)

ScalatestRouteTest已经提供了一个隐含的ActorySystem。从actorRefFactory方法中删除“隐式”修饰符,测试应该执行。

Spray.io: Can't compile test spec

答案 2 :(得分:3)

对于akka http:

在我的情况下,

引用了akka-http-microservice

  • implicit的{​​{1}}修饰符,也需要删除
  • 并且应该重新排序这样的特征:executionContext

答案 3 :(得分:2)

在我的情况下,当我在TestCase中也导入了import monix.execution.Scheduler.Implicits.global(可能有某种ExecutionContext)时,出现了未发现的隐式错误。

我修复了它,仅在我需要的方法中添加了monix Scheduler导入,而不是在顶部导入中添加了

答案 4 :(得分:1)

如果myRoutes实际上不是路由而是Directive[HNil],我可以使用Scala 2.10重现完全相同的错误消息。

我猜测你的未知服务.MyProxy课你的路线没有完成。

trait MyProxy extends HttpService {
   val myRoutes = path("foo") 
}

给出此错误

trait MyProxy extends HttpService {
  val myRoutes = path("foo") {
   complete(StatusCodes.Accepted)
 }
}

没有。

答案 5 :(得分:0)

您的build.sbt应该与akka流测试以及akka测试都具有依赖性。

然后它将获得任何依赖项。

请参阅此文档:-

scala route test doc

答案 6 :(得分:0)

为了进一步扩展先前给出的答案,有一些隐式内容不应由测试类扩展的其他任何Trait或类声明:

  • ActorSystem
  • ExecutionContext
  • DefaultHostInfo(软件包akka.http.scaladsl.testkit)
  • Actor材质器

如果其中的任何一个在ScalatestRouteTest中以外的地方声明,则将引发以下错误:

could not find implicit value for parameter ...TildeArrow[RequestContext, SomethingHereOther]