2014-04-16 75 views
3

我使用模擬式測試來確保我的整個應用程序正常工作。核心Clojure測試庫用於測試,通過Leiningen執行。當-main函數運行時,它定義了符號,以便在其邏輯中稍後使用。問題是如果我不小心使用了一個-main測試中創建的符號,但從未在當前的-main測試中定義符號,它仍然有一個值。我希望得到一個錯誤,該符號是未定義的,但似乎我的測試環境在某種程度上共享deftest執行狀態。我該如何處理這個問題?將我所有的便捷驅動符號定義移到let聲明中?如何防止Clojure測試之間的符號污染?

回答

5

如果你是def-在你的函數中出現全局變量,那麼通常認爲這是不好的做法和原因,因爲你建議使用let

但是,您可以捕獲名稱空間映射的快照。

(def ns-snapshot (ns-map *ns*)) 

讓你以後實習生符號

(def foo 1) 
(def bar 2) 

您可以確定增加

(reduce dissoc (ns-map *ns*) (keys ns-snapshot)) 
;=> {bar #'so.core/bar, foo #'so.core/foo} 

,並取消其映射

(doseq [[k v] (reduce dissoc (ns-map *ns*) (keys ns-snapshot))] (ns-unmap *ns* k)) 

這樣你會得到所需的未定義錯誤再次

foo ;=> CompilerException ... Unable to resolve symbol: foo in this context 
+0

有關解決額外符號問題的優秀信息。所以我是'def' -ing符號的原因之一是我也會在每個符號被定義之前和之後記錄消息。我是否應該嵌套'let'語句才能使其工作?或者你能想出更好的方法嗎? – user1559027

+0

@ user1559027也許用你正在談論的代碼示例發佈一個新問題?我不明白你從這個簡短的描述中做了什麼。 –

相關問題