Ich entwickle Web-App mit Scala, Play Framework. Und ich muss Controller mit der benutzerdefinierten Aktion testen. Bitte, schauen Sie auf den Code:Mock funktionales Argument der Funktion
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
}
}
Und unten finden Sie einen Code der Testklasse. Ich benutze Specs2 und ich habe org.mockito.exceptions.misusing.InvalidUseOfMatchersException
auf der Linie mit 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
}
}
}
Ich verstehe, dass ich block
Parameter des CustomAction
falsch verspotten. Kann mir jemand helfen, es richtig zu machen?
Die Art und Weise der Einrichtung Ihres Test würde der Wert 'result' des verspottete Wert' mock [Zukunft [Ergebnis]] halten '. Anders ausgedrückt, wenn Sie den Code verspotten, der den 'Block' ausführen soll, wird der Code in Ihrer Aktion nicht ausgeführt. Ich denke, ich würde' CustomAction' nicht mockern, sondern ihn Teil des Tests machen. – rethab