首先,抱歉,如果我搞砸了一些术语;我对Clojure很新。我正在尝试使用依赖于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-input-”,则测试通过文件“虽然”:
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 :(得分:0)
我认为您对此应该如何运作的期望是合理的,但我感觉describe
和it
宏在您的绑定表单有机会绑定它之前正在评估*input-file-name*
。我在简短的Lazytest探索中发现,我最好坚持使用框架提供的表单,而不是尝试用let
或binding
形式包装这两个宏中的任何一个。
当使用动态绑定来“推”参数到函数时,这些类型的问题似乎相当频繁(对我而言)。在可能的情况下,实际传递该参数更加可靠和易懂。
答案 1 :(得分:0)
如Stuart Sierra对Clojure google小组的描述(块引用不在此处):
describe
和it
都会创建函数。也就是说,他们扩大了
到(fn [] ...)
。围绕创建fn包装binding
没有效果。
更好地控制创建fn的位置以及失败的方式
报告,您可以使用do-it
和expect
。
(描述...... (做它...... (捆绑 ... (期待......)))
这将产生您正在寻找的结果。
http://groups.google.com/group/clojure/browse_thread/thread/d181e4731bdf9beb
确实,他们确实产生了我想要的结果:)