Как заставить REPL распознавать тесты на карте? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть карта, определенная следующим образом:

"Arcane Golem"
    {:name        "Arcane Golem"
    :attack      4
    :health      4
    :mana-cost   3
    :type        :minion
    :set         :classic
    :rarity      :rare
    :description "Battlecry: Give your opponent a Mana 
Crystal."
    :battlecry   (fn battlecry [state minion]
                     {:test (fn []
                                (as-> (create-game [{:minions [(create-minion "Arcane Golem" :id "ag")]}]) $
                                      (battlecry $ (get-minion $ "ag"))
                                      (contains? (get-in $[:players "p1" :hand]) "Mana Crystal")))}
                     (-> (get-opponent state (:id minion))
                     (:id)
                     (add-card-to-hand state (create-card "Mana Crystal"))))}

Эта карта сама является парой ключ-значение в большой карте карт, называемой определениями карт.Как вы можете видеть, я написал тест для функции Battlecry ниже;однако, когда я запускаю REPL и запускаю все тесты в пространстве имен этих карт, появляется сообщение Ran 0 tests with 0 assertions. Как мне получить REPL для распознавания этого теста?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете использовать with-test - для определения функции и модульного теста одновременно

; with-test is the same as using {:test #((is...)(is...))} in the meta data of the function.

(:use 'clojure.test)

(with-test
    (defn my-function [x y]
      (+ x y))
  (is (= 4 (my-function 2 2)))
  (is (= 7 (my-function 3 4))))

(test #'my-function)            ;(test (var my-function))
=> :ok

ПРИМЕЧАНИЕ. При использовании with-test функция все равно должна быть определенав качестве глобальной переменной, используя defn (см. пример).Анонимный fn в качестве значения ключа карты не будет найден механизмом тестирования.

Что нужно сделать, это определить функцию как автономную переменную, а затем включить ссылку на нее на карте:

{:battlecry my-function}    ; for example

Сказав это, большинство людей (включая меня) предпочитают иметь отдельное пространство имен тестирования, чтобы тесты не загромождали исходный код.Мне нравится организовывать их как:

flintstones.core           ; main namespace
tst.flintstones.core       ; the unit test namespace

Затем они помещаются в подкаталоги ./src и ./test каталога dir проекта:

src/flintstones/core.clj            ; main namespace
test/tst/flintstones/core.clj       ; the unit tests

Но есть и другие возможности.См. Также обсуждение кулинарной книги Clojure по тестированию .

...