Clojure:如何在测试中使用灯具

时间:2013-05-03 02:03:46

标签: unit-testing clojure

我正在编写一些与数据库交互的单元测试。因此,在单元测试中使用设置和拆卸方法来创建然后删除表是很有用的。然而there are no docs:O在use-fixtures方法上。

以下是我需要做的事情:

 (setup-tests)
 (run-tests)
 (teardown-tests)

我目前对在每次测试之前和之后运行设置和拆卸感兴趣,但是在一组测试之前和之后一次。你是怎么做到的?

2 个答案:

答案 0 :(得分:22)

您无法使用use-fixtures为自由定义的测试组提供设置和拆卸代码,但您可以使用:once为每个命名空间提供设置和拆卸代码:

;; my/test/config.clj
(ns my.test.config)

(defn wrap-setup
  [f]
  (println "wrapping setup")
  ;; note that you generally want to run teardown-tests in a try ...
  ;; finally construct, but this is just an example
  (setup-test)
  (f)
  (teardown-test))    


;; my/package_test.clj
(ns my.package-test
  (:use clojure.test
        my.test.config))

(use-fixtures :once wrap-setup) ; wrap-setup around the whole namespace of tests. 
                                ; use :each to wrap around each individual test 
                                ; in this package.

(testing ... )

这种方法强制设置和拆除代码与测试所在的软件包之间存在一些耦合,但通常这不是一个大问题。您始终可以在testing部分进行自己的手动换行,例如参见the bottom half of this blog post

答案 1 :(得分:0)

根据API for clojure.test

<块引用>

Fixtures 允许您在测试前后运行代码,以设置 应在其中运行测试的上下文。

fixture 只是一个函数,它调用作为传递的另一个函数 争论。它看起来像这样:

(defn my-fixture [f]    
  ;; Perform setup, establish bindings, whatever.   
  (f) ;; Then call the function we were passed.    
  ;; Tear-down / clean-up code here.  
)

有“每个”固定装置用于围绕单个测试进行设置和拆除,但您写道,您想要“一次”固定装置提供的功能:

<块引用>

[A] "once" fixture 只运行一次,大约 命名空间中的所有测试。 “一次”装置对任务很有用 只需要执行一次,比如建立数据库 连接,或用于耗时的任务。

像这样将“一次”固定装置附加到当前命名空间:

(use-fixtures :once fixture1 fixture2 ...)

我可能会把你的装置写成这样:

(use-fixtures :once (fn [f] 
                      (setup-tests)
                      (f)
                      (teardown-tests)))