如何在Lazytest'describe'测试中重新绑定var?

时间:2010-12-12 21:43:58

标签: testing clojure

首先,抱歉,如果我搞砸了一些术语;我对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:
{}

我还有其他方法可以进行这种测试吗?

谢谢! 丹

2 个答案:

答案 0 :(得分:0)

我认为您对此应该如何运作的期望是合理的,但我感觉describeit宏在您的绑定表单有机会绑定它之前正在评估*input-file-name* 。我在简短的Lazytest探索中发现,我最好坚持使用框架提供的表单,而不是尝试用letbinding形式包装这两个宏中的任何一个。

当使用动态绑定来“推”参数到函数时,这些类型的问题似乎相当频繁(对我而言)。在可能的情况下,实际传递该参数更加可靠和易懂。

答案 1 :(得分:0)

如Stuart Sierra对Clojure google小组的描述(块引用不在此处):

describeit都会创建函数。也就是说,他们扩大了 到(fn [] ...)。围绕创建fn包装binding 没有效果。

更好地控制创建fn的位置以及失败的方式 报告,您可以使用do-itexpect

(描述......   (做它......     (捆绑 ...       (期待......)))

这将产生您正在寻找的结果。

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

确实,他们确实产生了我想要的结果:)