2013-11-27 3 views
2

Когда я делаю тест с использованием предложения let, чтобы структурировать некоторые определения и вызовы, заглушки работают не так, как я ожидал. Например:Использование midje, предоставляемого в условии let, не использует методы заглушки

Этот тест не

(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

Прежде всего, ваш тест будет даже терпеть неудачу, если meth2 был правильно заштрихован, так как (fn [] x) возвращает функцию, поэтому факт (fn [] x) => 246 никогда не будет сохранен.

Во-вторых, я думаю, что provided используется для вызова функций-заглушек только тогда, когда выполняет левую/правую часть фактов. В вашем случае это (fn [] x)x уже оценено в этой точке), а также 246 (который является постоянным). meth1 никогда не вызывается в контексте вашего факта, только заранее.

Чтобы изменить это, вы можете сделать одну из двух вещей. Либо вы сделаете 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

 Смежные вопросы

  • Нет связанных вопросов^_^