2017-09-26 5 views
0

재생 프레임 워크 2.5와 함께 Silhouette v4.0 라이브러리를 사용하고 있습니다. 그리고 play specs2를 사용하여 테스트 코드를 작성하려고했습니다. 하지만 테스트 클래스에서 다음과 같은 오류가 발생합니다.매개 변수 env에 대한 암시 적 값을 찾을 수 없습니다. com.mohiva.play.silhouette.api.Environment [utils.auth.DefaultEnv]

오류 메시지가

[error] could not find implicit value for parameter env: com.mohiva.play.silhouette.api.Environment[utils.auth.DefaultEnv] 
     .withAuthenticator[DefaultEnv](identity.loginInfo) 
            ^

여기가이 클래스와 유사한 다른 테스트 클래스가 제대로 컴파일하고 실행할 수있는 테스트 클래스

package controllers 

import com.google.inject.AbstractModule 
import org.joda.time.DateTime 
import org.specs2.specification.Scope 
import org.specs2.matcher._ 
import org.specs2.mock._ 
import play.api.test._ 
import play.api.libs.json._ 
import play.api.libs.json.Json 
import play.api.libs.json.Reads._ 
import play.api.libs.functional.syntax._ 
import play.api.libs.concurrent.Execution.Implicits._ 
import play.api.libs.mailer.{ MailerClient, Email } 
import play.api.inject.guice.GuiceApplicationBuilder 
import play.api.inject.bind 
import com.mohiva.play.silhouette.test._ 
import com.mohiva.play.silhouette.api._ 
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository 
import com.mohiva.play.silhouette.api.util._ 
import com.mohiva.play.silhouette.impl.providers._ 
import net.codingwell.scalaguice.ScalaModule 
import utils.auth.DefaultEnv 

class TestControllerSpec extends PlaySpecification with Mockito { 
    "case" in new Context { 
    new WithApplication(application) { 
     val request = FakeRequest(POST, "/api/test") 
     .withAuthenticator[DefaultEnv](identity.loginInfo) // <- 
     val result = route(app, request).get 
     status(result) must be equalTo OK 
    } 
    } 

    trait Context extends Scope { 
    val identity = User(
     loginInfo = LoginInfo(..) 
     .. 
    ) 

    implicit val env = FakeEnvironment[DefaultEnv](Seq(identity.loginInfo -> identity)) 

    class FakeModule extends AbstractModule with ScalaModule { 
     def configure() = { 
     bind[Environment[DefaultEnv]].toInstance(env) 
     } 
    } 

    lazy val application = new GuiceApplicationBuilder() 
     .overrides(new FakeModule) 
     .build 
    } 
} 

입니다. 범위와 함축적 인 문제가 있습니다. 따라서 컴파일을 제대로 할 수있는 다른 테스트 클래스를 모두 가져 오려고했습니다. 그러나 여전히 컴파일 할 수 없습니다. 일부 가져 오기가 누락 되었습니까?

답변

1

컴파일러의 설명에 따라 암시 적 값이 누락되었습니다. one of Silhouette's specs을 모델로 다음을 사용하십시오.

class TestControllerSpec extends PlaySpecification with Mockito { 
    "the POST request" should {  
    "return an OK response" in new Context { 
     new WithApplication(application) { 
     val identity = User(LoginInfo(...)) 
     implicit val env = FakeEnvironment[DefaultEnv](Seq(identity.loginInfo -> identity)) 
     val request = FakeRequest(POST, "/api/test") 
      .withAuthenticator(identity.loginInfo) 

     val result = route(app, request).get 
     status(result) must be equalTo OK 
     } 
    } 
    } 

    trait Context extends Scope { 
    ... 
    } 
} 
+0

이 문제를 해결하려면 최후의 수단으로 생각합니다. 그러나 어쨌든 그것을 빨리 해결하십시오. 어쨌든 귀하의 조언을 주셔서 감사합니다. – Gianfrance