2015-06-15 201 views
1

在我的测试中,我需要为每个功能重复这一块测试。在这种情况下,我正在测试不良请求函数,每个测试之间需要改变的是不良请求调用,代码和错误。Clojure避免重复测试

(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

我没有看到你的自动化实例的好方法。有时最好是明确的。虽然这有一些重复是一个读者更容易理解,而不是一个复杂和棘手的解决方案,可以节省几个字符,但10倍更复杂。 –

回答

1

是的,我认为宏是在clojure中做到这一点的方式。以你的代码,做一些自由派假设约bad-requesterror和其他的东西,我做了下面的例子:

(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)))) 

    [email protected])) 

; 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

+0

好的谢谢你的回复和考虑。 –