我正在使用喷雾器制作一个简单的测试规范,我无法正确编译,不知道我做错了什么。我的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扩展了演员
答案 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方法中删除“隐式”修饰符,测试应该执行。
答案 2 :(得分:3)
对于akka http:
在我的情况下,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)
答案 6 :(得分:0)
为了进一步扩展先前给出的答案,有一些隐式内容不应由测试类扩展的其他任何Trait或类声明:
如果其中的任何一个在ScalatestRouteTest
中以外的地方声明,则将引发以下错误:
could not find implicit value for parameter ...TildeArrow[RequestContext, SomethingHereOther]