作为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.
但是我无法使用run-tests
从REPL做同样的事情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)
答案 0 :(得分:56)
使用lein repl
启动REPL,然后:
(require '[clojure.test :refer [run-tests]])
(require 'your-ns.example-test)
(run-tests 'your-ns.example-test)
我更喜欢留在user
命名空间,而不是像another answer所提到的那样使用in-ns
进行更改。相反,将名称空间作为参数传递给run-tests
(如上所示)。
我还建议远离(use 'clojure.test)
;这就是为什么我在上面提出(require '[clojure.test :refer [run-tests]])
。有关更多背景信息,请阅读http://dev.clojure.org/jira/browse/CLJ-879
答案 1 :(得分:16)
在上面的示例中,repl位于错误的命名空间中。如果将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)
请注意,文件系统中的_
在命名空间中变为-
,/
变为.
。
答案 2 :(得分:0)
回顾:
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.