2012-02-01 2 views
5

Я делаю простой фрагмент, который должен передать Box[String] с запросом user-agent на вспомогательный класс, который возвращает классы css, которые должны быть добавлены в элемент html. Я делаю это, потому что кажется сложным получить Lift для предоставления html-ответа с условными комментариями, например, в html5boilerplate. Это то, что у меня есть сейчас, и это работает:Тестирование фрагмента в лифте

class LiftBoilerplate { 

    def render = "html [class+]" #> getClassForUserAgent(S.request) 

    private def getClassForUserAgent(request:Box[Req]) = request match { 
     case Full(r) => LiftBoilerplateHelper.getHtmlClass(r.userAgent) 
     case _ => "" 
    } 
} 

Моя проблема заключается в том, что я хотел бы написать модульный тест для этого типа:

object LiftBoilerplateSpecs extends Specification { 

    val session = new LiftSession("", randomString(20), Empty) 

    "LiftBoilerplate" should { 
    "add 'no-js' to the class of an html tag element" in { 

     val snippet = new LiftBoilerplate 
     val result = snippet.render(<html><head></head><body>test</body></html>) 

     result must ==/(<html class="no-js"><head></head><body>test</body></html>) 
    } 
    } 
} 

Этот тест не так S.request является Empty. Что я должен сделать, чтобы предоставить фрагмент с издеваемым запросом с помощью userAgent?

До сих пор я смотрел на http://www.assembla.com/spaces/liftweb/wiki/Unit_Testing_Snippets_With_A_Logged_In_User
и
http://www.assembla.com/spaces/liftweb/wiki/Mocking_HTTP_Requests
, но я не понимаю, как для того чтобы достигнуть своей цели.

ответ

3

Чтобы сделать запрос и применить его автоматически в каждом тестовом примере вам нужно будет использовать Trait AroundExample, чтобы обернуть каждый тест в вызове S.init:

object LiftBoilerplateSpecs extends Specification with AroundExample { 

    val session = new LiftSession("", randomString(20), Empty) 

    def makeReq = { 
    val mockRequest = new MockHttpServletRequest("http://localhost") 
    mockRequest.headers = Map("User-Agent" -> List("Safari")) 

    new Req(Req.NilPath, "", GetRequest, Empty, new HTTPRequestServlet(mockRequest, null), 
     System.nanoTime, System.nanoTime, false, 
    () => ParamCalcInfo(Nil, Map(), Nil, Empty), Map()) 
    } 

    def around[T <% Result](t: => T) = S.init(makeReq, session)(t) 

    "LiftBoilerplate" should { 
    "add 'no-js' to the class of an html tag element" in { 

     val snippet = new LiftBoilerplate 
     val result = snippet.render(<html><head></head><body>test</body></html>) 

     result must ==/(<html class="no-js"><head></head><body>test</body></html>) 
    } 
    } 
} 
+0

Отлично, но где есть множество пользовательского агента ? Должен ли он быть добавлен в 'Map' для' ParamCalcInfo'? –

+0

Нет, пятый параметр Req() является HttpRequest. Вы должны передать экземпляр его с помощью желаемых заголовков (например, User-Agent) –

+0

Я обновил ответ, чтобы показать насмешливый запрос. –

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