2016-12-05 6 views
2

Я разработал сервисы RESTful, используя play 2.5, и я пытаюсь разработать функциональные тесты для своих служб. Я следую официальной документации here todo it.Функциональные тесты Службы воспроизведения с использованием scalatest

Вот тест для контроллера:

package com.x.oms.controller 

import org.scalatestplus.play._ 
import play.api.inject.guice.GuiceApplicationBuilder 
import play.api.mvc.Action 
import play.api.mvc.Results._ 
import play.api.routing.Router 
import play.api.test.Helpers.{GET => GET_REQUEST} 

class Test extends PlaySpec with OneServerPerSuite { 
    implicit override lazy val app = 
    new GuiceApplicationBuilder().router(Router.from { 
     // TODO: Find out how to load routes from routes file. 
     case _ => Action { 
     Ok("ok") 
     } 
    }).build() 

    "Application" should { 
    "be reachable" in { 

     // TODO: Invoke REST services using Play WS 

     // TODO: Assert the result 
    } 
    } 
} 

Вот контроллер:

package controllers.com.x.oms 

import com.google.inject.Inject 
import com.x.oms.AuthenticationService 
import com.x.oms.model.DBModels.User 
import com.x.oms.model.UIModels.Token 
import play.api.Logger 
import play.api.libs.json.Json 
import play.api.mvc.{Action, Controller} 

class AuthenticationController @Inject()(as: AuthenticationService) extends Controller { 

    private val log = Logger(getClass) 

    def authenticate = Action(parse.json) { 
    request => 
     val body = request.body 
     val username = (body \ "username").as[String] 
     val password = (body \ "password").as[String] 

     log.info(s"Attempting to authenticate user $username") 
     val token = as.authenticate(User(username, password)) 
     log.debug(s"Token $token generated successfully") 
     token match { 
     case token: String => Ok(Json.toJson(new Token(token))) 
     case _ => Unauthorized 
     } 
    } 

    def logout = Action { 
    request => 
     val header = request.headers 
     as.logout(header.get("token").get) 
     Ok("Logout successful") 
    } 

    def index = Action { 
    request => 
     Ok("Test Reply") 
    } 

} 

Маршруты Файл:

# Routes 
# This file defines all application routes (Higher priority routes first) 
# ~~~~ 

POST  /login   controllers.com.x.oms.AuthenticationController.authenticate 
POST  /logout  controllers.com.x.oms.AuthenticationController.logout 

GET  /   controllers.com.x.oms.AuthenticationController.index 

Я не хочу, чтобы пересмотреть маршруты информации в каждом тесте. Мне нужна ваша помощь для загрузки файла маршрутов при создании приложения в каждом тесте.

Пожалуйста, дайте мне знать, как файл маршрута можно загрузить. Заранее спасибо.

ответ

1

Я предлагаю вам проверить ваш AuthenticationService вне инфраструктуры Play. Если вы хотите проверить контролеры сами, они просто классы, которые вы можете новый вверх и звонить непосредственно с помощью FakeRequest:

val api = new AuthenticationController(as) 

"fail an authentication attempt with bad credentials" in { 
    val request = FakeRequest(POST, "/login") 
    .withJsonBody(jsonBadCredentials) 
    val result = call(api.authenticate(), request) 
    status(result) mustBe UNAUTHORIZED 
} 
+0

Ваше решение сработало! Хотя мне пришлось добавить WithApplication для тестирования. Спасибо за вашу помощь. – Ravi

+0

Есть несколько способов добиться этого. Учитывая, что я вижу, что вы используете DI, мне бы хотелось, чтобы мои тесты расширяли PlaySpec, OneAppPerSuite (и, возможно, несколько других, если вы считаете полезным), где вы можете создать свое приложение через GuiceApplicationBuilder, а затем использовать инжектор DI для настройки вашей среды. – andyczerwonka