Как проверить Clojure, спецификации макросов?
Если я пытаюсь проверить спецификацию макроса с помощью clojure.spec.test.alpha, никакие тесты не запускаются, но если я определяю тот же макрос как функцию с той же спецификацией, последовательность тестов запускается для этой функции. Я всегда могу сгенерировать параметры для модульного тестирования макроса, но есть ли способ получить это бесплатно с помощью spec? Вот пример:
(ns private.tmp.spec-test
(:require [clojure.spec.alpha :as spec]
[clojure.spec.test.alpha :as stest]))
;;; Macro
(defmacro twice' [x]
`(* 2.0 ~x))
(spec/fdef twice'
:args (spec/cat :x double?)
:ret double?
:fn (fn [{{:keys [x]} :args, x2 :ret}]
(or (and
(Double/isNaN x)
(Double/isNaN x2))
(= x2 (+ x x)))))
(println (stest/summarize-results (stest/check `twice'))) ;; {:total 0}
;;; Function
(defn twice [x]
(* 2.0 x))
(spec/fdef twice
:args (spec/cat :x double?)
:ret double?
:fn (fn [{{:keys [x]} :args, x2 :ret}]
(or (and
(Double/isNaN x)
(Double/isNaN x2))
(= x2 (+ x x)))))
(println (stest/summarize-results (stest/check `twice))) ;; {:total 1, :check-passed 1}
1 ответ
Решение
Я задал этот вопрос в Clojure, Google Group, и единодушным является то, что проверка макросов не поддерживается. Предпочтительным методом тестирования является генерация параметров для модульных тестов test.check
,