如何使用 clojure.test 将夹具中的值传递给测试?
How to pass a value from a fixture to a test with clojure.test?
当使用 clojure.test's use-fixture 时,有没有办法将值从夹具函数传递到测试函数?
动态绑定和 with-redefs
是两个不错的选择。您可以从夹具中的测试命名空间绑定一个 var,然后在测试定义中使用它:
core.clj:
(ns hello.core
(:gen-class))
(defn foo [x]
(inc x))
test/hello/core.clj:
(ns hello.core-test
(:require [clojure.test :refer :all]
[hello.core :refer :all]))
(def ^:dynamic *a* 4)
(defn setup [f]
(binding [*a* 42]
(with-redefs [hello.core/foo (constantly 42)]
(f))))
(use-fixtures :once setup)
(deftest a-test
(testing "testing the number 42"
(is (= *a* (foo 75)))))
你可以通过比较直接调用测试(不使用固定装置)和通过 run-tests
:
调用它来判断它是否有效
hello.core-test> (a-test)
FAIL in (a-test) (core_test.clj:17)
testing the number 42
expected: (= *a* (foo 75))
actual: (not (= 4 76))
nil
hello.core-test> (run-tests)
Testing hello.core-test
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
{:test 1, :pass 1, :fail 0, :error 0, :type :summary}
这种方法之所以有效,是因为 fixtures 关闭了它们 运行 的测试,尽管它们实际上并没有直接(通常)调用测试函数因此使用闭包将信息传递给测试代码是有意义的。
也许不是一个直接的答案,但如果你的灯具无论如何都是 :each
灯具,或者你可以容忍它是一个 :each
灯具,你可以逃避并创建一个 set-up
函数返回相关状态并将其作为测试的第一行调用,而不是使用夹具。这可能是某些情况下的最佳方法。
(defn set-up [] (get-complex-state))
(deftest blah
(let [state (set-up)]
(frobnicate)
(query state)
(tear-down state)))
当使用 clojure.test's use-fixture 时,有没有办法将值从夹具函数传递到测试函数?
动态绑定和 with-redefs
是两个不错的选择。您可以从夹具中的测试命名空间绑定一个 var,然后在测试定义中使用它:
core.clj:
(ns hello.core
(:gen-class))
(defn foo [x]
(inc x))
test/hello/core.clj:
(ns hello.core-test
(:require [clojure.test :refer :all]
[hello.core :refer :all]))
(def ^:dynamic *a* 4)
(defn setup [f]
(binding [*a* 42]
(with-redefs [hello.core/foo (constantly 42)]
(f))))
(use-fixtures :once setup)
(deftest a-test
(testing "testing the number 42"
(is (= *a* (foo 75)))))
你可以通过比较直接调用测试(不使用固定装置)和通过 run-tests
:
hello.core-test> (a-test)
FAIL in (a-test) (core_test.clj:17)
testing the number 42
expected: (= *a* (foo 75))
actual: (not (= 4 76))
nil
hello.core-test> (run-tests)
Testing hello.core-test
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
{:test 1, :pass 1, :fail 0, :error 0, :type :summary}
这种方法之所以有效,是因为 fixtures 关闭了它们 运行 的测试,尽管它们实际上并没有直接(通常)调用测试函数因此使用闭包将信息传递给测试代码是有意义的。
也许不是一个直接的答案,但如果你的灯具无论如何都是 :each
灯具,或者你可以容忍它是一个 :each
灯具,你可以逃避并创建一个 set-up
函数返回相关状态并将其作为测试的第一行调用,而不是使用夹具。这可能是某些情况下的最佳方法。
(defn set-up [] (get-complex-state))
(deftest blah
(let [state (set-up)]
(frobnicate)
(query state)
(tear-down state)))