2012-06-05 4 views
7

Уроки Python связывают простые тесты с исходным кодом (в Python они находятся в документации по функциям). More info and examples here.Clojure эквивалент доктрины Python?

Есть ли что-то подобное для Clojure?

Я знаю модульные тесты с clojure.test, но ищет что-то более тесно интегрированное с источником (как правило, модульные тесты находятся в разных файлах, здесь я хочу провести тест «внутри» defn).

Поиск около найденного this, но кажется очень неудобным (тесты в реальном тексте, такие как Python - наверняка макрос, который расширяет defn, был бы предпочтительнее?).

Возможно, существует еще один способ решить общую проблему, которая заключается в том, что у меня есть некоторые тесты (обычно простые вещи, которые демонстрируют основные свойства функции), которые будут лучше включены в документацию (я использую marginalia) чем в отдельных тестовых файлах.

update Вот пример: У меня есть функция, которая вычисляет (манхэттенское) расстояние (в пикселях) от прямоугольника пикселей до центра изображения. Это звучит просто, но усложняется такими вещами, как разница в значении «центра» для изображений с нечетным или четным числом пикселей по сторонам или с какой частью блока вы измеряете. Поэтому мне пришлось написать несколько тестов, чтобы получить код прямо. И теперь я смотрю на документы, и на самом деле было бы лучше, если бы документы включали эти тесты, потому что они объясняли лучше, чем слова, что делает функция ...

ответ

10

и тест флаг в метаданных, http://clojure.org/special_forms

(defn 
^{:doc "mymax [xs+] gets the maximum value in xs using > " 
    :test (fn [] 
      (assert (= 42 (mymax 2 42 5 4)))) 
    :user/comment "this is the best fn ever!"} 
    mymax 
    ([x] x) 
    ([x y] (if (> x y) x y)) 
    ([x y & more] 
    (reduce mymax (mymax x y) more))) 

user=> (test #'mymax) 
:ok 
user=> (doc test) 
------------------------- 
clojure.core/test 
([v]) 
    test [v] finds fn at key :test in var metadata and calls it, 
    presuming failure will throw exception 
nil 
+0

выглядит идеально! понятия не имел, что существует. но как вы его запускаете? это тест лейн? –

+0

использовать функцию тестирования: (test # 'mymax), doc: http://clojuredocs.org/clojure_core/clojure.core/test –

1

Как насчет: pre и: post выражения? http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+0

о том, что это мило и очень близко, но он не позволяет мне привести конкретные примеры. я добавлю пример к вопросу, который может показать лучшее, что я ищу. –

+0

': pre' и': post' условия хороши для контрактов, не очень хороших для тестов. – ivant

Смежные вопросы