2016-12-09 3 views
0

Я пытаюсь проверить рамочные игры 2.5.10 контроллера, который использует пользовательский bodyparser и JSON валидатор:Как протестировать контроллер платформы воспроизведения, который использует настраиваемый элемент bodyparser?

class MessagingController { 
    def validateJson[A : Reads] = parse.json.validate(
    _.validate[A].asEither.left.map(e => BadRequest(JsError.toJson(e))) 
) 
    def createMessageThread() = Action(validateJson[InboundMessageThread]) { request => 
    Ok("OK") } 
    } 

Когда я бег простого тест, на это я получаю сообщение об ошибке:

For request 'POST /api/v1/messageThreads' [Invalid Json: No content to map due to 
end-of-input at [Source: [email protected]; line: 1, column: 0]] 

тест:

val fakeRequest = FakeRequest() 
     .withHeaders(HeaderNames.CONTENT_TYPE -> "application/json") 
     .withBody(Json.parse(
     s""" 
      |{ 
      | "participants": [ 
      | {"id": $currentUserId, "isAdmin": false} 
      | ], 
      | "isGroupThread": false 
      |} 
    """.stripMargin)) 

    val result = messagingController.createMessageThread()(fakeRequest).run() 
    status(result) mustBe OK 

Если изменить действие контроллера только Action, а затем проверять достоверность JSON в теле контроля Это работает. Я не хочу этого делать, потому что многие мои контроллеры REST должны разбирать JSON, а использование validateJson[T] уменьшает шаблон. Код также работает, если я отправляю одну и ту же полезную нагрузку с помощью curl.

Как проверить этот контроллер?

ответ

0

следующая вид запроса работает:

val request = FakeRequest() 
    .withHeaders(CONTENT_TYPE -> "application/json") 
    .withBody(Json.fromJson[Place](body).get) 
0

Попробуйте это, надеюсь, что это помогает

val postRequest = FakeRequest(POST, "/route/to/hit").withJsonBody(Json.obj(
    "participants" -> Json.arr(Json.obj("id" -> "currentUserId", "isAdmin" -> false)), 
    "isGroupThread" -> false 
)) 

    val result = await(messagingController.createMessageThread()(postRequest)) 

    status(result) must be equalTo (FORBIDDEN) 
+0

Это дает '415 не равный 403'. Если я добавлю вызов 'withHeaders' обратно, я получаю' 400 не равным 403', как раньше ... – jbrown

0

Вместо вызова действий с bodyparser JSON, я предложил бы называть его с ActionBuilder использованием парсер AnyContent тела и затем вызвать Json.validate из внутри тело - оттуда, вы получите трассировку стека и посмотреть, что не удалось:

class MessagingController {  
    def createMessageThread() = Action { request => 
    request.json.validate[MessageThread] { 
     case JsError(e) =>   
     logger.error(s"Failure parsing because $e") 
     BadRequest(JsError.toJson(e)) 
     case JsSuccess(e) =>  
     Ok("OK") 
    } 
    } 
} 
+0

Это хорошая идея. Но это возвращает «ОК». Если я добавлю обратно в bodyparser JSON с 'def createMessageThread() = Action (parse.json)', он снова сработает. Как вам нужно написать тест, который использует настраиваемый парсер тела? – jbrown

+0

OK У меня это работает с помощью 'Action (parse.json)', но когда я проверяю его с помощью 'Action.async (validateJson [InboundMessageThread]), он терпит неудачу. Я пересмотрю свой вопрос ... – jbrown