16

我正在编写一些与数据库交互的单元测试。出于这个原因,在我的单元测试中使用 setup 和 teardown 方法来创建然后删除表是很有用的。但是,在 use-fixtures 方法上没有文档:O。

这是我需要做的:

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

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

4

2 回答 2

25

您不能使用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例如,请参见这篇博文的下半部分

于 2013-05-03T07:15:36.260 回答
0

根据clojure.test 的 API

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

固定装置只是一个函数,它调用作为参数传递的另一个函数。它看起来像这样:

(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" 夹具只运行一次,围绕命名空间中的所有测试。“once”fixture 对于只需要执行一次的任务(例如建立数据库连接)或耗时的任务很有用。

将“一次”固定装置附加到当前命名空间,如下所示:

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

我可能会把你的夹具写成这样:

(use-fixtures :once (fn [f] 
                      (setup-tests)
                      (f)
                      (teardown-tests)))
于 2021-04-20T05:57:20.897 回答