2014-01-22 155 views
25

運行測試作爲一個新手到Clojure的,我已經使用leiningen創建具有從Clojure的REPL和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. 

但我無法從REP做同樣使用L-運行測試

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) 

回答

12

在您的例子中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

之後(in-ns'first-project.core-test),repl不知道運行測試或需要/使用函數的名稱空間。我試過(clojure.test/run-tests),但沒有找到任何測試(Ran 0測試) – anotherCode245

+0

首先加載文件。在emacs中,這是ctrl-c ctrl-k –

+0

你也可以通過ctrl-c alt -n將repl切換到命名空間 –

43

啓動REPL與lein 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

值得將':refresh-all'加入'require'your-ns' –

+4

@JakubM的確,但它需要是':reload-all':'(require'incanter.core-tests:reload-all)' –