2012-02-01 13 views
13

Próbuję napisać test Specs2, który przetestuje dane wyjściowe snippet w odpowiedzi na różne parametry, które normalnie byłyby przekazywane z szablonu , ale nie byłem w stanie wymyślić, jak to zrobić.Scala/Lift: Jak pisać testy jednostkowe, które testują odpowiedź fragmentu kodu na różne parametry?

Na przykład, w objaśnieniu urywka w tym div:

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

mam minięciu param1 parametru na fragmencie. Mój fragment będzie wyglądać mniej więcej tak:

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

Więc w moim teście, chcę sprawdzić, jak reaguje na inny fragment param1 Wartości

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

Jak ustawić param1?

Jestem dużą scala czasu i wyciąg newb (pochodzących z Pythona + Django), więc jeśli jestem szczeka niewłaściwe drzewa, proszę kierować mnie na prawo. Myślę, że tak być może, cały czas googlowałem i nie znalazłem żadnych pytań, które byłyby podobne do tego.

Dzięki,

Blake

Odpowiedz

11

Ok, stałam się tym zorientowali się. To pytanie nie spotkało się z dużym zainteresowaniem, ale na wypadek, gdyby ktoś tam był, szukając go z tym samym problemem/pytaniem, oto jak to zrobić:

Obiekt dźwigu "S" musi mieć dodane atrybuty arbitralne, aby poda nasz opis atrybutów, które chcemy przetestować na żądanie. Niestety są 2 problemy. Po pierwsze, obiekt "S" inicjowany jest tylko wtedy, gdy otrzymane jest żądanie http. Po drugie, S.attr jest niezmienny.

Winda ma pakiet o nazwie mockweb, który umożliwia wykonywanie fałszywych żądań http. Dokumentacja tego pakietu zazwyczaj mówi o sesjach testowych i loginach użytkownika i innych, ale zapewnia także mechanizmy inicjowania "S" w ramach testu specyfikacji.

Pierwszy problem, inicjowanie S, rozwiązuje się, definiując naszą klasę testową jako rozszerzenie specyfikacji WebSpec zamiast specyfikacji (WebSpec jest częścią pakietu mockweb i rozszerza specyfikację) i wywołując "withSFor" podczas definicji specyfikacji, która zainicjuje "S"

Drugi problem, który polega na tym, że S.attr jest niezmienny, rozwiązuje się metodą "S" zAttrs ". "withAttrs" wykonuje blok kodu, który podajesz zarówno zwykłymi atrybutami, jak i atrybutami dostarczonymi przez ciebie na mapie. Twoje dowolne atrybuty są dostępne tylko od S.attr tymczasowo

Oto test z mojego pierwotnego pytania, które zostały zmodyfikowane w celu rozwiązania problemów 2:

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

edit: jasność

+0

pamiętać, że wygląda podobnie jak w Lift 2.4, cecha WebSpec, której używasz, wymaga wycofanych [Specyfikacji] (https://code.google.com/p/specs/) w przeciwieństwie do [Specs2] (http://etorreborre.github.com/ specs2 /). Znalazłem cechę WebSpec2 w istocie (https://gist.github.com/2235088), przez [strona "Unit Testing Snippets with A Logged In User" na wiki portalu Assembla] (http: // www. assembla.com/wiki/show/liftweb/Unit_Testing_Snippets_With_A_Logged_In_User). –

+1

Nie wiem, czy to pomaga przy mniejszym nakładzie: https://www.assembla.com/wiki/show/liftweb/Testing_Lift_Applications – tyoc213