在我的测试中,我需要为每个函数重复一个测试块。在这种情况下,我正在测试错误请求函数,每次测试之间需要更改的是错误的请求调用,代码和错误。
(deftest t-bad-request
...
(testing "with data"
(equal (merge error code message DATA) (bad-request MESSAGE DATA)))
(testing "without message and with data"
(equal (merge error code DATA) (bad-request nil, DATA))))
"正确的方式"在clojure中解决它?宏?
答案 0 :(得分:1)
是的,我认为宏是在clojure中执行此操作的方法。考虑到代码并对bad-request
,error
和其他内容做了一些自由的假设,我编写了以下示例:
(require '[clojure.test :refer [deftest testing is]])
; dummy implementations, here will be your real bad-request & error
(defn bad-request [& more] more)
(def error {:status :error})
(defmacro deftest-request [name code message MESSAGE DATA & body]
`(deftest ~name
(testing "with data"
(is (= (merge error ~code ~message ~DATA) (bad-request ~MESSAGE ~DATA))))
(testing "with data"
(is (= (merge error ~code ~message ~DATA) (bad-request ~MESSAGE ~DATA))))
~@body))
; Some messages will only be tested about bad requests
(deftest-request some-request-test
{:code 401} {:message "hello"} "HELO" {:data "WORLD"})
; Other messages can have more tests at the end of a deftest-request
(deftest-request some-complex-request-test
{:code 829} {:message "a-complex-message"} "IM COMPLEX" {:data "VERY COMPLEX"}
(testing "request returns something interesting"
(is (= "I'm cool" (run-request {:message "a-complex-message"})))))
deftest-request
将运行两个常见的错误请求测试,并传递给它的任何其他表单。
当然,您应该考虑使用这种方法与普通旧测试的权衡...在大多数情况下,使用普通的旧测试更清楚......但是如果您有很多类似的测试和/或复杂的测试准备,一个宏可以帮助。
应用此技术的一个很好的例子是sqlingvo test suite