Невозможно удалить дублирование при составлении тестов

Я не могу удалить дубликаты внутри clojure.test тестовое задание.

Предположим, у меня есть несколько реализаций для одной и той же абстракции:

(defn foo1 [] ,,,)
(defn foo2 [] ,,,)
(defn foo3 [] ,,,)

и у меня также есть тест, который должен пройти все реализации:

(defn test-impl [foo]
  (is (= ,,, (foo))))

Теперь я могу создать clojure.test тест, который проверяет все реализации за один шаг:

(deftest test-all-impls
  (test-impl foo1)
  (test-impl foo2)
  (test-impl foo3))

Все хорошо; Запустив тесты в REPL я получаю:

(run-tests)

Testing user

Ran 1 tests containing 3 assertions.
0 failures, 0 errors.
=> {:test 1, :pass 3, :fail 0, :error 0, :type :summary}

Теперь я хочу изменить test-all-impls чтобы удалить дублирование необходимости вызывать test-impl явно для каждой из реализаций. Мне приходит в голову изменить test-all-impls следующее:

(deftest test-all-impls
  (for [foo [foo1 foo2 foo3]] (test-impl foo))

Хм, сейчас не все хорошо; в ответ я получаю:

(run-tests)

Testing user

Ran 1 tests containing 0 assertions.
0 failures, 0 errors.
=> {:test 1, :pass 0, :fail 0, :error 0, :type :summary}

Что мне не хватает?

2 ответа

Решение

Чтобы обойти ленивость for, используйте доза вместо:

(deftest test-all-impls
  (doseq [foo [foo1 foo2 foo3]] (test-impl foo))

Другой ответ - преобразовать результат в вектор, который заставит for цикл для запуска:

(deftest test-all-impls
  (vec (for [foo [foo1 foo2 foo3]] (test-impl foo))))
Другие вопросы по тегам