Невозможно удалить дублирование при составлении тестов
Я не могу удалить дубликаты внутри 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))))