Тестирование фрагмента в Lift - PullRequest
5 голосов
/ 02 февраля 2012

Я делаю простой фрагмент, который должен передать Box[String] с пользовательским агентом запросов в класс помощника, который передает классы 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
но я не понимаю, как достичь своей цели.

1 Ответ

3 голосов
/ 25 мая 2012

Чтобы сделать запрос и применить его автоматически в каждом тестовом примере, вам нужно использовать 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>)
    }
  }
}
...