2012-02-01 77 views
13

Tôi đang cố gắng viết một bài kiểm tra Specs2 để kiểm tra đầu ra của đoạn mã theo các tham số khác nhau. , nhưng tôi đã không thể tìm ra cách để làm điều đó.Scala/Lift: Làm cách nào để viết các bài kiểm tra đơn vị kiểm tra phản hồi của một đoạn mã với các tham số khác nhau

Ví dụ, với các callout đoạn trong div này:

<div class="lift:Snippet.method?param1=foo"></div> 

Tôi đang đi qua các tham số param1 đối với đoạn. Đoạn tôi sẽ giống như thế này:

class Snippet { 
    def method(in:NodeSeq):NodeSeq = { 
    val param1 = S.attr("param1") openOr "" 
    param1 match { 
     case "foo" => //do something 
     case "bar" => //do something else 
     case _ => //do yet another thing 
    } 
    } 
} 

Vì vậy, trong thử nghiệm của tôi, tôi muốn kiểm tra cách đoạn đáp ứng param1 khác nhau các giá trị

class SnippetTest extends Specification { 
    "Snippet" should { 
    "do something" in { 
     val html = <ul> 
      <li class="first"> 
      <li class="second"> 
      <li class="third"> 
     </ul> 

     //I need to set param1 here somehow 
     val out = Snippet.method(html) 
     //then check that it did what it was supposed to 
     out.something must be "xyz" 
    } 
    } 
} 

Làm thế nào để tôi thiết param1?

Tôi là một scala thời gian lớn và nâng newb (đến từ python + django), vì vậy nếu tôi sủa cây sai, xin vui lòng hướng dẫn tôi đến đúng. Tôi nghĩ rằng có thể là trường hợp, tôi đã googling về điều này cả ngày và đã không tìm thấy bất kỳ câu hỏi từ xa tương tự như thế này.

Cảm ơn,

Blake

Trả lời

11

Ok, tôi đã nhận được này đã tìm ra. Câu hỏi này đã không thấy nhiều sự quan tâm, nhưng trong trường hợp bất cứ ai đang có googling với cùng một vấn đề/câu hỏi, đây là cách bạn làm điều đó:

Đối tượng "S" của Lift cần thêm các thuộc tính tùy ý của chúng tôi rằng nó sẽ cung cấp cho đoạn của chúng tôi các thuộc tính chúng tôi muốn kiểm tra khi được hỏi. Thật không may, có 2 vấn đề. Đầu tiên, đối tượng "S" chỉ được khởi tạo khi nhận được yêu cầu http. Thứ hai, S.attr là bất biến.

Nâng có gói được gọi là mockweb cho phép bạn thực hiện các yêu cầu http giả. Tài liệu cho gói này thường nói về các phiên kiểm tra và thông tin đăng nhập của người dùng và không có điều gì, nhưng nó cũng cung cấp các cơ chế để khởi tạo "S" như một phần của một bài kiểm tra đặc tả. Vấn đề đầu tiên, khởi tạo S, được giải quyết bằng cách xác định lớp thử nghiệm của chúng tôi như là một phần mở rộng của WebSpec thay vì đặc tả (WebSpec là một phần của gói mockweb và mở rộng Đặc tả), và gọi "withSFor" trong định nghĩa đặc tả, sẽ khởi tạo "S"

Vấn đề thứ hai, đối phó với S.attr là không thay đổi được giải quyết bằng phương thức "S" "withAttrs". "withAttrs" thực hiện một khối mã bạn cung cấp với cả hai thuộc tính thông thường và các thuộc tính do bạn cung cấp trong bản đồ. thuộc tính độc đoán của bạn chỉ có sẵn từ S.attr tạm

Dưới đây là thử nghiệm từ câu hỏi ban đầu của tôi đã được sửa đổi để giải quyết 2 vấn đề:

import net.liftweb.mockweb._ 

class SnippetTest extends WebSpec { 
    "Snippet" should { 
    "do something" withSFor("/") in { 
     val html = <ul> 
      <li class="first"> 
      <li class="second"> 
      <li class="third"> 
     </ul> 

     //here I set param1 
     var m = new HashMap[String, String] 
     m += "param1" -> "foo" 

     val s = new Snippet() 

     //then tell S to execute this block of code 
     //with my arbitrary attributes. 
     //'out' will be the NodeSeq returned by s.method 
     val out = S.withAttrs(S.mapToAttrs(m)){ 
     s.method(html) 
     } 

     //then check that it did what it was supposed to 
     out.something must be "xyz" 
    } 
    } 
} 

chỉnh sửa: rõ ràng

+0

Lưu ý rằng nó trông như trong Lift 2.4, đặc tính WebSpec mà bạn sử dụng yêu cầu [Specs] không được chấp nhận (https://code.google.com/p/specs/) như trái ngược với [Specs2] (http://etorreborre.github.com/ specs2 /). Tôi đã tìm thấy một đặc điểm WebSpec2 trong một gist (https://gist.github.com/2235088), thông qua [trang "Đoạn trích kiểm tra đơn vị với người dùng đã đăng nhập" trên wiki nâng Assembla] (http: // www. assembla.com/wiki/show/liftweb/Unit_Testing_Snippets_With_A_Logged_In_User). –

+1

Không biết điều này có giúp ích ít hơn không: https://www.assembla.com/wiki/show/liftweb/Testing_Lift_Applications – tyoc213