Scala / specs2:找不到类型为 AsExecution[ExecutionEnv => MatchResult[Future[AuthenticationResult]]] 的证据参数的隐式值
Scala / specs2 : could not find implicit value for evidence parameter of type AsExecution[ExecutionEnv => MatchResult[Future[AuthenticationResult]]]
我正在尝试将 Scala/Play 应用程序升级到 Play 2.7
、Scala 2.12.11
。
我有以下测试,在我升级 Play 和 Scala 之前,它可能曾经有效。
升级后出现如下编译错误:
Error: could not find implicit value for evidence parameter of type org.specs2.specification.core.AsExecution[org.specs2.concurrent.ExecutionEnv => org.specs2.matcher.MatchResult[scala.concurrent.Future[services.AuthenticationResult]]]
import org.specs2.concurrent.ExecutionEnv
import org.specs2.mutable.Specification
import scala.concurrent.duration._
class AuthenticationServiceSpec extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in { implicit ee: ExecutionEnv =>
service.authenticateUser("myname", "mypassowrd") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
为了尝试解决编译错误,我在 class 构造函数中添加了一个隐式参数(顺便说一句,之前它是如何工作的,没有隐式参数?):
import org.specs2.concurrent.ExecutionEnv
import org.specs2.mutable.Specification
import scala.concurrent.duration._
import scala.concurrent.Future
import org.specs2.specification.core.AsExecution
import org.specs2.matcher.MatchResult
class AuthenticationServiceSpec(implicit ee: AsExecution[ExecutionEnv => MatchResult[Future[AuthenticationResult]]]) extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in { implicit ee: ExecutionEnv =>
service.authenticateUser("myname", "mypassowrd") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
但是在 运行 测试时 运行 出现错误:
Can't find a suitable constructor with 0 or 1 parameter for class org.specs2.specification.core.AsExecution
基于AsExecution
的构造函数,有道理...
那我该如何解决这个问题呢?
这应该有效
class AuthenticationServiceSpec(implicit ee: ExecutionEnv) extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in {
service.authenticateUser("myname", "mypassword") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
ee: ExecutionEnv
将在构建规范时直接注入。
这就是消息的意思Can't find a suitable constructor with 0 or 1 parameter for class ...
。 specs2
尝试为规范递归构建参数,如果它们具有带 0 或 1 个参数的构造函数。 ExecutionEnv
是这样一个论点,specs2
能够自行构建。
我正在尝试将 Scala/Play 应用程序升级到 Play 2.7
、Scala 2.12.11
。
我有以下测试,在我升级 Play 和 Scala 之前,它可能曾经有效。
升级后出现如下编译错误:
Error: could not find implicit value for evidence parameter of type org.specs2.specification.core.AsExecution[org.specs2.concurrent.ExecutionEnv => org.specs2.matcher.MatchResult[scala.concurrent.Future[services.AuthenticationResult]]]
import org.specs2.concurrent.ExecutionEnv
import org.specs2.mutable.Specification
import scala.concurrent.duration._
class AuthenticationServiceSpec extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in { implicit ee: ExecutionEnv =>
service.authenticateUser("myname", "mypassowrd") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
为了尝试解决编译错误,我在 class 构造函数中添加了一个隐式参数(顺便说一句,之前它是如何工作的,没有隐式参数?):
import org.specs2.concurrent.ExecutionEnv
import org.specs2.mutable.Specification
import scala.concurrent.duration._
import scala.concurrent.Future
import org.specs2.specification.core.AsExecution
import org.specs2.matcher.MatchResult
class AuthenticationServiceSpec(implicit ee: AsExecution[ExecutionEnv => MatchResult[Future[AuthenticationResult]]]) extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in { implicit ee: ExecutionEnv =>
service.authenticateUser("myname", "mypassowrd") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
但是在 运行 测试时 运行 出现错误:
Can't find a suitable constructor with 0 or 1 parameter for class org.specs2.specification.core.AsExecution
基于AsExecution
的构造函数,有道理...
那我该如何解决这个问题呢?
这应该有效
class AuthenticationServiceSpec(implicit ee: ExecutionEnv) extends Specification {
"The AuthenticationService" should {
val service: AuthenticationService = new MyAuthenticationService
"correctly authenticate Me" in {
service.authenticateUser("myname", "mypassword") must beEqualTo (AuthenticationSuccessful).await(1, 200.millis)
}
}
}
ee: ExecutionEnv
将在构建规范时直接注入。
这就是消息的意思Can't find a suitable constructor with 0 or 1 parameter for class ...
。 specs2
尝试为规范递归构建参数,如果它们具有带 0 或 1 个参数的构造函数。 ExecutionEnv
是这样一个论点,specs2
能够自行构建。