Выполните тесты от Clojure Repl и Leiningen

Как новичок в clojure, я использовал leiningen для создания примера проекта с

lein new app first-project

который дал мне этот каталог

.
├── doc
│   └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
├── src
│   └── first_project
│       └── core.clj
├── target
│   └── repl
│       ├── classes
│       └── stale
│           └── extract-native.dependencies
└── test
    └── first_project
        └── core_test.clj

Не изменяя никаких файлов, я могу успешно запустить единственный неудачный тест с

lein test
...
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
Tests failed.

Но я не могу сделать то же самое из REPL с помощью run-тестов

lein repl
first-project.core=> (use 'clojure.test)
nil
first-project.core=> (run-tests)

Testing first-project.core

Ran 0 tests containing 0 assertions.
0 failures, 0 errors.
{:type :summary, :pass 0, :test 0, :error 0, :fail 0}

Я пытался (но не работает)

(require 'first-project.core-test)

4 ответа

Решение

В приведенном выше примере repl находится в неправильном пространстве имен. Это может работать лучше, если вы переключите репл на core_test Пространство имен. а потом беги (run-tests),

(in-ns 'first-project.core-test)
(run-tests)

Еще один интересный способ разработки тестов - просто запускать их из REPL до тех пор, пока они не будут работать, потому что тесты - это обычные функции с некоторыми дополнительными метаданными.

(in-ns 'first-project.core-test)
(my-test)

Помните, что вы должны загрузить файл в дополнение к вызову in-ns Допустим, ваш тестовый файл tests/first_project/core_test.clj, тогда вам нужно будет позвонить

(load "tests/first_project/core_test")
(in-ns 'first-project.core-test)
(my-test)

Имейте в виду, что _ в файловой системе становится - в пространстве имен и / становится .,

Начать ответ с lein repl, затем:

(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test)
(run-tests 'your-ns.example-test)

Я предпочитаю оставаться в user пространство имен, в отличие от изменения его с in-ns как уже упоминалось в другом ответе. Вместо этого передайте пространство имен в качестве аргумента run-tests (как показано выше).

Я также рекомендовал бы держаться подальше от (use 'clojure.test); вот почему я предложил (require '[clojure.test :refer [run-tests]]) выше. Для получения дополнительной информации читайте http://dev.clojure.org/jira/browse/CLJ-879

Резюмируем:

Способ require

Полная квалификация функций необходима только в том случае, если вы оформили in-nsранее. Затем сделайте:

(clojure.core/require '[clojure.core :refer [require]]
                      '[clojure.test :refer [run-tests]]
                      '[clojure.repl :refer [dir]])

; Load whatever is in namespace "foo.bar-test" and reload everything
; if `:reload-all` has been additionally given

(require 'foo.bar-test :reload-all) 
;=> nil

; List your tests for good measure (Note: don't quote the namespace symbol!)

(dir foo.bar-test)
;=> t-math
;=> t-arith
;=> t-exponential
;=> nil 

; Check meta-information on a test to verify selector for example 

(meta #'foo.bar-test/t-math)
;=> {:basic-math true, :test #object[foo.bar_tes...

; `run-tests` will probably run nothing because the current namespace
; doesn't contain any tests, unless you have changed it with "in-ns"

(run-tests) 
;=> Ran 0 tests containing 0 assertions.

; run tests by giving namespace explicitly instead

(run-tests 'foo.bar-test) 
;=> Ran 3 tests containing 29 assertions.

Просто добавьте, что если вы используете VsCode + Calva, вы можете запустить repl и запустить тесты для текущего пространства имен.ctrl+alt+c t

Другие вопросы по тегам