2015-01-22 4 views
0

Я хочу написать единичный тест, чтобы протестировать мой пользовательский механизм действий.Как я могу проверить это пользовательское действие, которое расширяет ActionBuilder?

Как только я установил ActionWithSession как в экземпляре в своем тесте, как мне создать экземпляр, как если бы он был в контроллере?

Как я могу проверить для случаев краев, если он перенаправляет или возвращает с помощью сеанса?

class SessionAwareRequest[A](val context: MyContext, request: Request[A]) extends WrappedRequest[A](request) 

class ActionWithSession @Inject()(siteConfig: SiteConfig, userService: UserService) 
    extends ActionBuilder[SessionAwareRequest] { 

    def invokeBlock[A](request: Request[A], block: (SessionAwareRequest[A]) => Future[Result]) = { 
    val session = loadSession(request) 

    if(session.isDefined) { 
     val result: Future[Result] = block(new SessionAwareRequest(session.get, request)) 
     result.map(_.withCookies(CookieHelper.newSession(session.get)(request))) 
    } 
    else { 
     Future.successful(Results.Redirect(routes.MessagesController.show("error!"))) 

    } 

    def loadSession(requestHeader: RequestHeader): Option[MySession] = { 
    ... 
     Some(MySession(...)) 
    else 
     None 
    } 

} 

ответ

3

Если вы используете Play 2.3, вы должны быть в состоянии использовать PlaySpecification признак, который обеспечивает метод call для проверки действия. Посмотрите на Documentation, особенно в разделе «Unit Testing EssentialAction ».

Вот искусственный минимальный пример, основанный на коде, который вы опубликовали. Он в основном просто проверяет, содержит ли заголовки запроса поле «foo», и если да, возвращает OK вместе с дополнительным файлом cookie «baz», который добавляется через пользовательский механизм действий. Если заголовок «foo» отсутствует, он возвращает значение BadRequest. Надеюсь, поможет.

import play.api.mvc._ 
import play.api.test.{FakeRequest, PlaySpecification} 
import scala.concurrent.Future 

class ActionSpec extends PlaySpecification { 
    case class MySession() 

    class SessionAwareRequest[A](val context: MySession, request: Request[A]) extends WrappedRequest[A](request) 

    object ActionWithSession extends ActionBuilder[SessionAwareRequest] { 

    def loadSession(requestHeader: RequestHeader): Option[MySession] = { 
     if (requestHeader.headers.get("foo").isDefined) 
     Some(MySession()) 
     else 
     None 
    } 

    def invokeBlock[A](request: Request[A], block: (SessionAwareRequest[A]) => Future[Result]): Future[Result] = { 
     val session = loadSession(request) 

     if (session.isDefined) { 
     val result: Future[Result] = block(new SessionAwareRequest(session.get, request)) 
     result.map(_.withCookies(Cookie("baz", "quux"))) 
     } else { 
     Future.successful(Results.BadRequest) 
     } 
    } 
    } 

    "My custom action" should { 

    "return HTTP code 400 in case the request header does not contain a 'foo' field" in { 
     val foo = call(ActionWithSession { request => 
     Results.Ok("Yikes") 
     }, FakeRequest()) 
     status(of = foo) must beEqualTo(BAD_REQUEST) 
     cookies(of = foo).get("baz") must beNone 
    } 

    "return HTTP code 200 in case the request header does contain a 'foo' field" in { 
     val foo = call(ActionWithSession { request => 
     Results.Ok("Yikes") 
     }, FakeRequest().withHeaders("foo" -> "bar")) 
     status(of = foo) must beEqualTo(OK) 
     cookies(of = foo).get("baz") must beSome 
    } 
    } 

} 
Смежные вопросы