2017-02-26 17 views
1

私はScala、Play Frameworkを使ってWebアプリケーションを開発しています。そして私はカスタムアクションでコントローラをテストする必要があります。コードを見てください:関数のモック関数引数

package controllers.helpers 

import play.api.mvc.{ActionBuilder, Request, Result} 

import scala.concurrent.Future 

class CustomAction extends ActionBuilder[Request] { 

    override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = { 
    // do some stuff 
    block(request) 
    } 
} 


package controllers 

import javax.inject.Singleton 

import play.api.mvc.Controller 

@Singleton 
class SomeController @Inject() (customAction: CustomAction 
          ) extends Controller { 

    def foo() = customAction(parse.json) { implicit request => 
    // do some stuff and create result 
    } 
} 

以下では、テストクラスのコードを見つけることができます。私はSpecs2を使用して、私は私が間違ってCustomActionblockパラメータを模擬することを理解customeActionMock.invokeBlock(any[Request[_]], any[(Request[_]) => Future[Result]]) returns mock[Future[Result]]

package controllers 
import controllers.helpers.CustomAction 
import org.specs2.mock.Mockito 
import play.api.mvc.{Request, Result} 
import play.api.test.{FakeHeaders, FakeRequest, PlaySpecification} 

import scala.concurrent.Future 

class SomeControllerSpec extends PlaySpecification with Mockito { 
    private val customeActionMock = mock[CustomAction] 
    customeActionMock.invokeBlock(any[Request[_]], any[(Request[_]) => Future[Result]]) returns mock[Future[Result]] //this doesn't work, exception is thrown there 


    "SomController" should { 
    "respond Ok on valid request" in { 
     val result = new UserController(customeActionMock).foo()(FakeRequest()) 
     status(result) shouldEqual OK 
    } 
    } 
} 

とライン上org.mockito.exceptions.misusing.InvalidUseOfMatchersExceptionを得ました。誰かが私にそれを適切にするのを助けることができますか?

+0

あなたのテストの設定方法は、 'result'という値はmockされた値' mock [Future [Result]] 'を保持します。別の言い方をすれば、 'block'を実行するはずのコードを偽装すると、アクション内のコードは実行されません。私は' CustomAction'を模倣しないでテストの一部にすると思います。 – rethab

答えて

0

はのCustomActionを模擬しないでください:

class SomeControllerSpec extends PlaySpecification with Mockito { 
    private val customeActionMock = new CustomAction 


    "SomController" should { 
    "respond Ok on valid request" in { 
     val result = new UserController(customeActionMock).foo()(FakeRequest()) 
     status(result) shouldEqual OK 
    } 
    } 
} 
1

私のプロジェクトでは、2.5.xのを再生使用しています私はスケートを使用します。これがコントローラをテストする方法です。

import org.scalatestplus.play.OneAppPerSuite 
import org.scalatest._ 
import org.scalatest.time.{Millis, Seconds, Span} 
import org.scalatest.concurrent.ScalaFutures 
import scala.concurrent.Future 

class SomeControllerSpec extends FlatSpec with Matchers with ScalaFutures with OneAppPerSuite { 
private val customeActionMock = new CustomAction // create an instance of a class 
implicit val defaultPatience = PatienceConfig(timeout = Span(5,Seconds), interval = Span(500, Millis)) 

it should "respond Ok on valid request" in { 
    val resultF : Future[Result] = new UserController(customeActionMock).foo()(FakeRequest()) 
    whenReady(resultF) { resultR => 
     resultR.header.status shouldBe 200 
    } 
    } 
} 
+0

私は再生キャッシュを有効にして2.6を使用しています。私はその実装を模擬しようと3時間を費やしています。同じエラーが発生したため、テスト用に独自のキャッシングクラスを作成しました。 Play2のために下を押してください。ありがとう@ecamur。 –