Подтвердить что ты не робот

Как я могу написать тест для обработки ожидаемого исключения?

Как я могу проверить функцию, которая генерирует ожидаемое исключение? Вот функция, которая генерирует исключение:

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

Я хочу создать тест, подобный следующему, в котором исключение бросается и поймается, а затем сравнивается. Не работает следующее:

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

Я получаю следующие ошибки:

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.    

Очевидно, что мне не хватает чего-то о написании тестов. У меня проблемы с этим. Мой проект был создан с lein new, и я запускаю тесты с лейн-тестом.

Спасибо.

4b9b3361

Ответ 1

Последнее утверждение в вашем тесте неверно; это должно быть (is (= excp1 "s-o-m is not a sequence")), так как map1 не является последовательностью карт.

Кроме того, возможно, будет понятнее использовать (is (thrown? ..)) или (is (thrown-with-msg? ...)) для проверки на наличие исключений.

Пример:

(t/is (thrown? java.lang.ClassCastException (s/valid? ::sut/int-value "x"))))

Обратите внимание, что вы просто пишете имя класса в виде символа. Используйте java.lang.Exception, если вам нет дела до точного Exception.