2010-12-12 10 views
1

まず最初に、私がいくつかの専門用語を使いこなしていれば、ごめんなさい。私はClojureにはかなり新しいです。私はvarバインディングに依存するLazytestを使って非常に簡単なテストを書こうとしています。私は、テストファイル内のvarを再バインドして、テスト中のコードにそのバインディングを使用させることはできません。ここでLazytestの「記述」テストでvarを再バインドするにはどうすればよいですか?

は、私がテストしようとしているコードです:

(ns liar-liar.core 
    (:gen-class)) 

(def *input-file-name*) 

(defn parse-input 
    "Just print return a var for now..." 
    [] 
    *input-file-name*) 

(defn -main [& args] 
    (binding [*input-file-name* (first args)] 
    (println (parse-input)))) 

そして、ここではテストです:私はこのテストを実行しようとすると

(ns liar-liar.test.core 
    (:use lazytest.describe) 
    (:use liar-liar.core)) 

(binding [*input-file-name* "my-input-file"] 
    (describe parse-input "Just returns a var" 
    (it "returns a var" 
     (= "my-input-file" (parse-input))))) 

、私はこのエラーを取得する:

java.lang.IllegalStateException: Var liar-liar.core/*input-file-name* is unbound. 

魅力的に、私がバインディングフォームを移動すると、

(ns liar-liar.test.core 
    (:use lazytest.describe) 
    (:use liar-liar.core)) 

(describe parse-input "Just returns a var" 
    (it "returns a var" 
    (binding [*input-file-name* "my-input-file"] 
     (= "FAIL" (parse-input))))) 

テストは正常に動作しますが、(パーズ入力)式の値が出力されないため、レポートは理想的ではありません( "FAIL"を "my-入力ファイル "):

FAILURE: Namespaces liar-liar.test.core #'liar-liar.core/parse-input Just returns a var returns a var 
at liar_liar/test/core.clj line 7 
Expression: (binding [*input-file-name* my-input-file] (= FAIL (parse-input))) 
Result: false 
Local bindings: 
{} 

この種のテストを行うには別の方法がありますか?

ありがとうございます! ダン

答えて

0

(ブロック引用はここで働いていない)ClojureのGoogleのグループにスチュアート・シエラで説明したように:

describeitの両方が関数を作成します。つまり、 から(fn [] ...)に拡張されます。折り返しbindingにはfnの作成の前後に の効果はありません。

fnがどこで作成され、どのように障害が報告されるかを詳細に制御するには、が報告されます。do-itexpectを使用できます。

(説明... (DO-それを... (結合... (期待...)))

これは、あなたが探している結果が得られます。

http://groups.google.com/group/clojure/browse_thread/thread/d181e4731bdf9beb

確かに、彼らは私が返信用:)

0

私はこれがどのように動作するかをあなたの期待が合理的だと思うが、私はあなたの結合フォームがそれをバインドする機会を得る前にdescribeitマクロは*input-file-name*を評価している感じています。私は簡単なLazytestの調査で、letまたはbindingフォームで2つのマクロのいずれかをラップしようとするよりも、フレームワークによって提供されるフォームに固執するほうが良いことがわかりました。

これらの種類の問題は、動的バインディングを使用して関数に引数をプッシュするとかなり頻繁に発生します(私にとっては、とにかく)。可能であれば、実際にその議論を実際に伝えることは、はるかに信頼性が高く理解できる。

+0

おかげで探していた結果を生成しました!私はその機能に入力ファイル名を渡すだけの良いアドバイスだと思います。動的にバインドされたvarにする理由はありません。 –

関連する問題