2013-11-27 39 views
2

當我使用外部let子句構造一些定義和調用進行測試時,存根不按我期望的方式工作。例如:使用let子句中提供的midje不存在方法

測試失敗

(fact "blah" 
    (let [x (meth1 123)] 
    x => 246 
    (provided 
     (meth2 123) => 246))) 

有了這個代碼

(defn meth2 [x] 
    (prn "meth2" x) 
    (* 3 x)) 

(defn meth1 [x] 
    (let [y (meth2 x)] 
    y)) 

難道我不應該使用let語句與midje?我無法理解如何在不移除let的情況下讓這些通過。

回答

3

首先,如果因爲(fn [] x)返回一個函數而導致meth2被正確存根,那麼您的測試甚至會失敗,因此事實(fn [] x) => 246將永遠不會成立。

其次,我認爲provided是用來存根函數調用只有當執行事實的左側/右側。在你的情況下,這是(fn [] x)(並且x已經被評估過),以及246(這是常數)。從來沒有在事實的情況下被調用,只是事先。

要改變這一點,你可以做兩件事之一。要麼你讓你的事實的左手側的let部分:

... 
(let [x (meth1 123)] x) => 246 
... 

或者你讓x當事實經過測試的評估函數:

... 
(let [x #(meth1 123)] (x)) => 246 
... 

我不認爲有辦法真正在行動中看到provided,即是這樣的:

(let [x (meth1 123)] 
    x => 369 
    (let [...] 
    x => 246 
    (provided 
     (meth2 123) => 246)))) 

一個let包裝事實似乎在第一個事實被觸及之前執行。

+1

這就是我最終的目標。與使用上下文進行設置和清理一起,而不是使用let語句 – aciniglio

相關問題