2017-09-26 38 views
0

我使用的是具有play framework 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

相關問題