2012-02-01 37 views
5

Tôi đang tạo một đoạn mã đơn giản phải vượt qua một Box[String] với yêu cầu tác nhân người dùng đến lớp trợ giúp chuyển các lớp css sẽ được thêm vào phần tử html. Tôi đang làm điều này vì nó có vẻ khó khăn để có được Lift để cung cấp một html html với ý kiến ​​có điều kiện như những người trong html5boilerplate. Đây là những gì tôi có bây giờ và nó hoạt động:Thử nghiệm một đoạn mã trong Mã số

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 _ => "" 
    } 
} 

Vấn đề của tôi là tôi muốn viết một bài kiểm tra đơn vị cho như thế này:

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>) 
    } 
    } 
} 

thử nghiệm này thất bại kể từ S.requestEmpty. Tôi nên làm gì để cung cấp đoạn mã với yêu cầu giả mạo với userAgent trong đó?

Cho đến nay tôi đã xem xét 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
nhưng tôi không hiểu làm thế nào để đạt được mục tiêu của tôi.

Trả lời

3

Để thực hiện yêu cầu và áp dụng nó tự động trong mỗi ví dụ thử nghiệm, bạn sẽ cần phải sử dụng các Trait AroundExample để quấn mỗi bài kiểm tra trong một cuộc gọi 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

Tuyệt vời, nhưng mà là tập hợp user agent ? Nó có nên được thêm vào trong 'Bản đồ' được đưa ra cho' ParamCalcInfo' không? –

+0

Không, thông số thứ 5 của Req() là một HttpRequest. Bạn nên chuyển một phiên bản của nó với các Tiêu đề mong muốn (ví dụ: Tác nhân Người dùng) –

+0

Tôi đã cập nhật câu trả lời để hiển thị yêu cầu được mô phỏng. –

Các vấn đề liên quan