2012-08-15 41 views
13

Tôi làm cách nào để thử nghiệm một hàm có thể ném ngoại lệ dự kiến? Đây là chức năng ném ngoại lệ:Làm cách nào để viết một bài kiểm tra để xử lý ngoại lệ dự kiến?

(defn seq-of-maps? 
    "Tests for a sequence of maps, and throws a custom exception if not." 
    [s-o-m] 
    (if-not (seq? s-o-m) 
    (throw (IllegalArgumentException. "s-o-m is not a sequence")) 
    (if-not (map? (first s-o-m)) 
     (throw (IllegalArgumentException. "s-o-m is not a sequence of maps.")) 
     true))) 

Tôi muốn thiết kế một thử nghiệm như sau, trong đó ngoại lệ được ném và bắt và sau đó so sánh. Sau đây không hoạt động:

(deftest test-seq-of-maps 
    (let [map1 {:key1 "val1"} 
     empv [] 
     s-o-m (list {:key1 "val1"}{:key2 "val2"}) 
     excp1 (try 
       (seq-of-maps? map1) 
       (catch Exception e (.getMessage e)))] 
    (is (seq-of-maps? s-o-m)) 
    (is (not (= excp1 "s-o-m is not a sequence"))))) 

Tôi nhận được các lỗi này:

Testing util.test.core 

FAIL in (test-seq-of-maps) (core.clj:27) 
expected: (not (= excp1 "s-o-m is not a sequence")) 
    actual: (not (not true)) 

Ran 2 tests containing 6 assertions. 
1 failures, 0 errors.  

Rõ ràng, tôi đang thiếu một cái gì đó về cách viết bài kiểm tra. Tôi đang gặp khó khăn trong việc tìm ra điều đó. Dự án của tôi đã được thiết lập với lein mới, và tôi đang chạy các bài kiểm tra với thử nghiệm lein.

Cảm ơn.

+0

có thể trùng lặp của [Làm thế nào để tôi mong đợi thất bại trong một bài kiểm tra đơn vị?] (Http://stackoverflow.com/questions/7852092/how-do-i-expect-failure-in-a-unit-test) –

Trả lời

15

Xác nhận cuối cùng trong thử nghiệm của bạn là không chính xác; nó phải là (is (= excp1 "s-o-m is not a sequence")) vì map1 không phải là bản đồ của bản đồ.

Ngoài ra, có thể rõ ràng hơn khi sử dụng (is (thrown? ..)) hoặc (is (thrown-with-msg? ...)) để kiểm tra các trường hợp ngoại lệ được ném.

+0

+1 để sử dụng (đã ném? ...) – Alex

Các vấn đề liên quan