Как мне перепривязать переменную в тесте Lazytest «описать»? - PullRequest
1 голос
/ 13 декабря 2010

Прежде всего, извините, если я испорчу какую-то терминологию;Я довольно новичок в Clojure.Я пытаюсь написать очень простой тест с использованием Lazytest, который зависит от привязки var.Кажется, я не могу перепривязать переменную в тестовом файле и заставить тестируемый код использовать эту привязку.

Вот код, который я пытаюсь проверить:

(ns liar-liar.core
  (:gen-class))

(def *input-file-name*)

(defn parse-input
  "Just print return a var for now..."
  []
  *input-file-name*)

(defn -main [& args]
  (binding [*input-file-name* (first args)]
    (println (parse-input))))

И воттест:

(ns liar-liar.test.core
  (:use lazytest.describe)
  (:use liar-liar.core))

(binding [*input-file-name* "my-input-file"]
  (describe parse-input "Just returns a var"
    (it "returns a var"
      (= "my-input-file" (parse-input)))))

Когда я пытаюсь запустить этот тест, я получаю эту ошибку:

java.lang.IllegalStateException: Var liar-liar.core/*input-file-name* is unbound.

Интересно, что если я переместу форму привязки:

(ns liar-liar.test.core
  (:use lazytest.describe)
  (:use liar-liar.core))

(describe parse-input "Just returns a var"
  (it "returns a var"
    (binding [*input-file-name* "my-input-file"]
      (= "FAIL" (parse-input)))))

Тест работает должным образом, но отчетность не идеальна, так как не выводит значение выражения (parse-input) (тест пройден, если я заменю «FAIL» на «my-input-»).file "Хотя):

FAILURE: Namespaces liar-liar.test.core #'liar-liar.core/parse-input Just returns a var returns a var
at liar_liar/test/core.clj line 7
Expression: (binding [*input-file-name* my-input-file] (= FAIL (parse-input)))
Result: false
Local bindings:
{}

Есть ли какой-то другой способ, которым я должен идти о проведении такого рода тестирования?

Спасибо!Dan

Ответы [ 2 ]

0 голосов
/ 16 декабря 2010

Как описано Стюартом Сьеррой в группе Google Clojure (здесь не работает блок-цитата):

Оба describe и it создают функции. То есть они расширяются до (fn [] ...). Обтекание binding вокруг создания fn без эффекта.

Для более точного контроля того, где создается fn и как возникают сбои сообщили, что вы можете использовать do-it и expect.

(опишите ... (сделай это ... (обязательный ... (ожидайте ...)))

Это даст результаты, которые вы ищете.

http://groups.google.com/group/clojure/browse_thread/thread/d181e4731bdf9beb

Действительно, они дали результаты, которые я искал:)

0 голосов
/ 15 декабря 2010

Я думаю, что вы ожидаете, что это должно работать, разумно, но у меня есть ощущение, что макросы describe и it оценивают *input-file-name* до того, как ваша обязательная форма сможет связать ее. В моих кратких исследованиях Lazytest я обнаружил, что лучше придерживаться форм, предоставляемых платформой, чем пытаться обернуть любой из этих двух макросов формами let или binding.

Подобные проблемы кажутся довольно частыми (во всяком случае, для меня) при использовании динамического связывания для «проталкивания» аргументов в функцию. Гораздо надежнее и понятнее передать этот аргумент, где это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...