2012-02-01 6 views
13

通常、テンプレートから渡される異なるパラメータに応じてスニペットの出力をテストするSpecs2テストを作成しようとしていますしかし、私はそれを行う方法を理解することができませんでした。例えばScala/Lift:異なるパラメータに対するスニペットの応答をテストする単体テストを書くにはどうすればいいですか?

、このdivの中にスニペットコールアウトで:

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

Iは、スニペットに、パラメータPARAM1を渡しています。私のスニペットは、このようなものになります。だから私のテスト中に、私はスニペットが異なるのparam1にどのように反応するかテストしたい

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

を私はPARAM1を設定するにはどうすればよい

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

値?

私はビッグタイムのスケーラであり、newb(python + djangoから来ている)を持ち上げているので、間違ったツリーを吠えている場合は、私に正しいものを指示してください。私はそれが事実かもしれないと思う、私はこれを一日中検索していて、これと遠隔的に何の質問も見つけられていない。

おかげで、

ブレイク

答えて

11

は[OK]を、私はこれが考え出し得ています。この質問はあまり関心がありませんでしたが、誰かが同じ問題/質問でグーグルグーグルをしている場合、あなたのやり方は次のとおりです:

リフトの "S"オブジェクトには任意の属性が追加されている必要があります。聞いたときにテストしたい属性をスニペットに与えます。残念ながら、2つの問題があります。第1に、「S」オブジェクトは、http要求が受信されたときにのみ初期化される。第二に、S.attrは不変です。

リフトにはmockwebという名前のパッケージがあり、模擬HTTPリクエストを行うことができます。このパッケージのドキュメンテーションは、通常、セッションやユーザログインなどのテストについて話しますが、仕様テストの一環として「S」を初期化するためのメカニズムも提供しています。

Sを初期化する最初の問題は、テストクラスを仕様(WebSpecはmockwebパッケージの一部であり仕様を拡張)ではなくWebSpecの拡張として定義し、仕様定義の間に "withSFor"を呼び出すことで解決されます。 "S"を初期化する

第2の問題は、Sattrが不変であることを扱うことは、 "S"メソッド "withAttrs"で解決される。 "withAttrs"は、あなたが提供するコードブロックを通常の属性と、あなたがマップで提供する属性の両方で実行します。あなたの任意の属性は、ここでは一時的にのみ

S.attrから入手できます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" 
    } 
    } 
} 

編集:明快

+0

注それが見えることLift 2.4のように、使用するWebSpecの特性には、[Specs2](http://etorreborre.github.com/)ではなく[Dependated] [仕様](https://code.google.com/p/specs/)が必要です。 specs2 /)。私は、[Assembla Lift wikiの[ログインしたユーザーによる単位テストのスニペット]](http://www.windowsfiles.jpを参照)を介して、要点(https://gist.github.com/2235088)でWebSpec2の特性を見つけました。アセンブリルート。 –

+1

ほんの少しでも役立つかどうかわかりません:https://www.assembla.com/wiki/show/liftweb/Testing_Lift_Applications – tyoc213

関連する問題