Тест clojure, который бросает утверждение

У меня есть функция, определенная как:

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

И тогда у меня есть тест для этого:

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

Однако этот тест не проходит:

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

Что нужно, чтобы проверить, что утверждение выдает ошибку?

1 ответ

Решение

Причина, по которой ваше утверждение не выполняется, потому что вы вкладываете два is, Внутренний is уже ловит исключение, поэтому внешний is Тест не пройден, потому что ничего не выброшено.

(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
Другие вопросы по тегам