gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:07:30 24 4
gpt4 key购买 nike

我正在使用Spray开发一个简单的测试规范,但无法正确编译它,也不知道我做错了什么。我的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扩展了Actor

最佳答案

我只是为这个问题而苦苦挣扎。为了弄清楚,我深入了Akka HTTP代码库,它是implicit的丛林。

我的问题似乎是,如果没有正确的辅助implicit,就找不到正确的TildeArrow实例。如果您查看代码,则错误消息中所需的TildeArrow实例在伴随对象中被定义为implicit def injectIntoRoute,并且需要整个其他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的具体实例,因此编译器正在尝试使用 abstract class TildeArrow满足隐式分辨率,而完全未指定的抽象 typeta.Out没有 ~>定义的。

在我的特定情况下,无论什么意思,我都缺少一个隐式的 ExecutionContextExecutor



更新

实际上,我进一步研究了它,问题是我在路由特征中声明了 implicit def ec: ExecutionContextExecutor,但是 trait RouteTest将其名称定义为 executor,因此当我定义自己的名称以实现缺少的隐式时,我最后得到两个相同的隐式。

这是一个可爱的API,但是IMO却无法控制隐式魔术,尤其是考虑到错误消息的隐秘性。

关于scala - 如何在测试规范中修复参数ta缺少的隐式值:TildeArrow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28324230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com