Я работаю над проектом play-2.4 и написал такой контроллер:
package controllers
import play.api._
import play.api.mvc._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
class Application extends Controller {
def index = Action.async { implicit request =>
Future { Ok(request.body.asJson.get) }
}
}
с POST / controllers.Application.index
в conf/routes
.
Я проверил, что это работает нормально, выполнив curl --request POST --header "Content-type: application/json" --data '{"foo":"bar"}' http://localhost:9000/
.
Теперь я написал спецификацию для этого контроллера:
package controllers
import org.specs2.mutable._
import org.specs2.runner._
import org.junit.runner._
import play.api.test._
import play.api.test.Helpers._
@RunWith(classOf[JUnitRunner])
class ApplicationSpec extends Specification {
"Application" should {
val controller = new Application
val fakeJson = """{ "foo":"bar" }"""
val fakeRequest = FakeRequest()
.withHeaders("Content-type" -> "application/json")
.withBody(fakeJson)
val index = controller.index()(fakeRequest).run
status(index) must equalTo(OK)
}
}
но это привело к ошибке времени выполнения:
[error] None.get (Application.scala:11)
[error] controllers.Application$$anonfun$index$1$$anonfun$apply$1.apply(Application.scala:11)
[error] controllers.Application$$anonfun$index$1$$anonfun$apply$1.apply(Application.scala:11)
Я вставил println(request.body)
в контроллер и обнаружил, что тело запроса было AnyContentAsEmpty
, что означает, что fakeJson
было удалено из fakeRequest
.
Как я могу правильно прикрепить JSON к FakeRequest?
* примечание: хотя я могу написать как FakeRequest(POST, '/', FakeHeaders(), fakeJson)
, но я думаю, что это нехорошо, потому что спецификация контроллера не должна обрабатывать методы или маршруты HTTP.
Буду признателен за любую помощь.