clojureclojure.test

clojure test that assertion throws


I have a function defined as:

(defn strict-get
  [m key]
  {:pre [(is (contains? m key))]}
  (get m key))

And then I have a test for it:

(is (thrown? java.lang.AssertionError (strict-get {} :abc)))

However this test fails:

  ;; FAIL in () (myfile.clj:189)
  ;; throws exception when key is not present
  ;; expected: (contains? m key)
  ;; actual: (not (contains? {} :abc))

What is needed to check that the assertion would throw an error?


Solution

  • The reason your assertion fails because you are nesting two is. The inner is already catches the exception so the outer is test then fails because nothing is thrown.

    (defn strict-get
      [m key]
      {:pre [(contains? m key)]} ;; <-- fix
      (get m key))
    

    (is (thrown? java.lang.AssertionError (strict-get {} nil)))
    ;; does not throw, but returns exception object for reasons idk
    
    (deftest strict-get-test
      (is (thrown? java.lang.AssertionError (strict-get {} nil))))
    
    (strict-get-test) ;; passes