En tant que débutant à clojure, j'ai utilisé leiningen pour créer un exemple de projet avec
lein new app first-project
qui m'a donné ce répertoire
.
├── 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
Sans modifier aucun fichier, je peux lancer avec succès le seul test qui échoue avec
lein test
...
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
Tests failed.
Mais je ne peux pas faire la même chose depuis le REPL en utilisant des run-tests
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}
J'ai essayé (mais ça ne marche pas)
(require 'first-project.core-test)
Dans votre exemple ci-dessus, le repl est dans le mauvais espace de noms. Cela peut mieux fonctionner si vous basculez la réponse vers core_test
espace de noms. puis exécutez (run-tests)
.
(in-ns 'first-project.core-test)
(run-tests)
Une autre façon amusante de développer des tests consiste à simplement les exécuter à partir du REPL jusqu'à ce qu'ils fonctionnent, car les tests sont des fonctions normales avec quelques métadonnées supplémentaires.
(in-ns 'first-project.core-test)
(my-test)
N'oubliez pas que vous devez charger le fichier en plus d'appeler in-ns
Supposons que votre fichier de test soit tests/first_project/core_test.clj
, alors vous devrez appeler
(load "tests/first_project/core_test")
(in-ns 'first-project.core-test)
(my-test)
Garde en tête que _
dans le système de fichiers devient -
dans l'espace de noms et /
devient .
.
Démarrez un REPL avec lein repl
, puis utilisez obligatoire
(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test :reload-all)
(run-tests 'your-ns.example-test)
Je préfère rester dans l'espace de noms user
, plutôt que de le changer avec in-ns
comme mentionné par autre réponse . À la place, passez l'espace de noms comme argument à run-tests
(Comme montré ci-dessus).
Je recommanderais également de rester à l'écart de (use 'clojure.test)
; c'est pourquoi j'ai suggéré (require '[clojure.test :refer [run-tests]])
au dessus. Pour plus d'informations, lisez http://dev.clojure.org/jira/browse/CLJ-879
Récapituler:
Façon de require
Une qualification complète des fonctions n'est nécessaire que si vous avez délivré un in-ns
plus tôt. Alors fais:
(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.