Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure避免重复测试_Clojure - Fatal编程技术网

Clojure避免重复测试

Clojure避免重复测试,clojure,Clojure,在我的测试中,我需要为每个函数重复这个测试块。在本例中,我正在测试错误请求函数,在每次测试之间需要更改的是错误请求调用、代码和错误 (deftest t-bad-request ... (testing "with data" (equal (merge error code message DATA) (bad-request MESSAGE DATA))) (testing "without message and with data"

在我的测试中,我需要为每个函数重复这个测试块。在本例中,我正在测试错误请求函数,在每次测试之间需要更改的是错误请求调用、代码和错误

(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中解决它的“正确方法”是什么?宏?

是的,我认为宏是clojure实现这一点的方法。以您的代码为例,对
错误请求
错误
以及其他内容做了一些自由的假设,我编写了以下示例:

(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
将运行两个常见的错误请求测试,以及传递给它的任何附加表单

当然,你应该考虑使用这种方法与简单的旧测试的权衡。在大多数情况下,更清楚的是使用普通的旧测试。。。但是,如果您有很多类似的测试和/或复杂的测试准备,宏可能会有所帮助


应用这项技术的一个很好的例子是

我看不到一个自动化示例的好方法。有时候最好是直言不讳。虽然这有一些重复,但对于读者来说,比一个复杂而棘手的解决方案更容易理解,它可以节省几个字符,但要复杂10倍。