3

外部の 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))

letmidje を含むステートメントを使用することは想定されていませんか? を削除せずにこれらを渡す方法がわかりませんlet

4

1 に答える 1

4

まず第一に、関数を返すため、meth2正しくスタブされた場合でもテストは失敗するため、事実は決して保持されません。(fn [] x)(fn [] x) => 246

第二に、事実の左側/右側を実行するprovidedときにのみ、関数呼び出しをスタブ化するために使用されると思います。あなたの場合、それは(そしてその時点ですでに評価されています)、そして(これは一定です)。事前にのみ、事実のコンテキストで呼び出されることはありません。(fn [] x)x246meth1

これを変更するには、次の 2 つのいずれかを行うことができます。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ファクトに触れる前に、ラッピング ファクトが実行されるようです。

于 2013-11-27T09:01:41.587 に答える