0

次のコードでは、bar 関数を実装する前に foo 関数をテストしたいと思います。

(unfinished bar)

(def tbl {:ev1 bar})
(defn foo [ev] ((tbl ev)))

(fact "about an indirect call"
  (foo :ev1) => nil
  (provided
    (bar) => nil))

しかし、ミジェは次のように述べています。

FAIL at (core_test.clj:86)
These calls were not made the right number of times:
    (bar) [expected at least once, actually never called]

FAIL "about an indirect call" at (core_test.clj:84)
    Expected: nil
      Actual: java.lang.Error: #'bar has no implementation,
      but it was called like this:
(bar )

foo がバーを直接呼び出していないため、'provided' はバー関数をフックできないと考えました。しかし、次のように 2 行目を変更したかどうかもわかりました。

(def tbl {:ev1 #(bar)})

その後、テストは成功しました。

最初のバージョンで成功する方法はありますか?

ありがとう。

PS: Clojure 1.5.1 と Midje 1.5.1 を使用しています。

4

1 に答える 1

0

providedのフレーバーを使用して、 varwith-redefsのルートを変更します。定義するとき、すでに var を逆参照しており、実行するロジックへの参照ではなく、バインドされていない値を含めるように求めます。私が言おうとしているのは、すでに評価された値の代わりを提供することはできません。tbl#'bartbl

同様に:

(defn x [] 0)
(def tbl {:x x})
(defn x [] 1)
((:x tbl)) ;; => 0

あなたが望むのは、変数自体を次の場所に保存することですtbl

(defn x [] 0)
(def tbl {:x #'x})
(defn x [] 1)
((:x tbl)) ;; => 1

テストについても同じです。を使用する(def tbl {:ev1 #'bar})と、合格します。

于 2013-11-25T12:18:59.043 に答える