Scala / specs2: не удалось найти неявное значение для параметра доказательства типа AsExecution [ExecutionEnv => MatchResult [Future [AuthenticationResult]]] - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь обновить приложение 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)
    }

  }

}

Чтобы попытаться устранить ошибку компиляции, я добавил неявный параметр в конструктор класса ( Кстати, как это работало раньше, без неявного параметра?):

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, это имеет смысл ...

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 27 мая 2020

Это должно работать

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 может построить сам по себе.

...