2015-06-15 198 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

好的謝謝你的回覆和考慮。 –