我正在编写一些与数据库交互的单元测试。出于这个原因,在我的单元测试中使用 setup 和 teardown 方法来创建然后删除表是很有用的。但是,在 use-fixtures 方法上没有文档:O。
这是我需要做的:
(setup-tests)
(run-tests)
(teardown-tests)
我目前对在每次测试之前和之后运行设置和拆卸不感兴趣,但在一组测试之前和之后一次。你怎么做到这一点?
我正在编写一些与数据库交互的单元测试。出于这个原因,在我的单元测试中使用 setup 和 teardown 方法来创建然后删除表是很有用的。但是,在 use-fixtures 方法上没有文档:O。
这是我需要做的:
(setup-tests)
(run-tests)
(teardown-tests)
我目前对在每次测试之前和之后运行设置和拆卸不感兴趣,但在一组测试之前和之后一次。你怎么做到这一点?
您不能使用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
例如,请参见这篇博文的下半部分。
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)))