midje - как ожидать разные результаты для двух идентичных вызовов функций (включая исключение, которое будет выброшено)
Я применил политику повторных попыток для функции обновления (обращаясь к базе данных) - если обновление вызывает исключение, я повторяю его до 10 раз. Я издеваюсь над функцией обновления с Midje. Я хочу смоделировать тот первый раз, когда это терпит неудачу, и второй раз, когда это успешно. Я попробовал это:
(fact "update is retried when failed"
(ud/ensure-data {:username ..username.. :data :h}) => ..result..
(provided
(ud/get-raw-user-data ..username..) => example-user-data-raw
(ud/update-user-data {:username ..username..
:version 1
:userdata {:data {:h {}}}}) =throws=> (Exception.)
(ud/update-user-data {:username ..username..
:version 1
:userdata {:data {:h {}}}}) => ..result..))
но это не похоже на работу...... Ответ таков:
These calls were not made the right number of times:
(ud/update-user-data {:username ..username.., :version 1, :userdata {:homebases {:h {:sensors []}}}}) [expected at least once, actually never called]
Я также нашел потоки ( https://github.com/marick/Midje/wiki/Variant-prerequisite-arrows), но я не знаю, как объединить исключения с успешными вызовами с потоками.
1 ответ
У меня нет четкого понимания того, как использовать потоки Midje. Таким образом, мое личное решение, одним словом, не использовать provided
или "потоки", но используйте with-redefs
и "окурки".
(defn fn0 [] -1) ;; function we want to mock
;; fn1 retries fn0 if there is an exception
(defn fn1 [] (try
(fn0)
(catch Exception e
(do
(prn "Exception Caught, try again...")
(fn0)))))
(def call-count (atom -1)) ;; counts how many times fn0 is called
;; stub fn0 by returning different result
(defn make-stub [& result-seqs]
(fn [& _]
(swap! call-count inc)
(let [result (nth result-seqs @call-count)]
(if (instance? Throwable result)
(throw result)
result))))
(fact "fn1 ignores first exception and returns second call to fn0"
(with-redefs [fn0 (make-stub (Exception. "stubbed error") 100)]
(fn1) => 100))