1

更新機能 (データベースとの対話) の再試行ポリシーを実装しました。更新で例外がスローされた場合は、最大 10 回再試行します。私は midje で更新機能を嘲笑しています。初めて失敗し、2回目に成功することをシミュレートしたい。私はこれを試しました:

(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 )も見つけましたが、例外と成功の呼び出しをストリームと組み合わせる方法がわかりません。

4

1 に答える 1

0

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))
于 2015-07-21T11:29:35.667 に答える