2016-12-22 6 views
1

私のシステムの部品は本当にうまく出ていますが、述語の1つを明らかに間違ったものに変更すると、私のテストがすべてパスしたことに気付き、私が依存してきた仕様から通常のブローアップが得られません。間違ったスペックを与えてもテストで爆発が起きないのはなぜですか?

なぜこれが起こっているのかわかりません。確かにそれはlein new testから再現できません。

spec.testは、私のシステムのこの部分を特定したくないと仮定するのではなく、デバッグ目的のために仕様を見つけることができないという警告を私に与える方法がありますか?この状況をデバッグして、他の方法で私を助けることができますか?

+1

テストを実行する前に 'spec.test/instrument'を呼び出しますか? –

+0

ええ、私は明示的にそれを述べておくべきだったと思います。 – expez

答えて

0

は最小限に複製したものです:

(ns test.core 
    (:require [clojure.spec :as s])) 

(defn my-specced-fn [x] 
    x) 

(s/fdef my-specced-fn 
     :args (s/cat :arg int?)) 

(ns test.core-test 
    (:require [clojure 
      [test :refer :all]] 
      [test.core :as core] 
      [clojure.spec.test :as spec-test])) 

(spec-test/instrument) 

(deftest my-specced-fn-test 
    (is (= 1 (core/my-specced-fn 1)))) 

このテストでは、最初に渡されます。私はtest.coreを編集し、スキーマを変更してtest.coreを再評価します。 string?のような述部を使用してスキーマを変更した後は、テストは失敗するはずですが、それは引き続き通過します。この問題を解決するには、テスト名前空間(特にinstrumentへの呼び出し)を再評価します。

+0

"スキーマ"と言うと、私はあなたが "spec"、特にmy-specced-fn fdefを意味すると思います。 –

+0

'instrument'を実行した時点で、' my-specced-fn' varは新しいvarに置き換えられます。これは、あなたが機器*を使っている時のfdef *の ':args'を検証する関数です。この仕様への変更は、再度計測するまで取得されません。 –

+0

うん、それはすべて理にかなっている、私はちょうど '楽器'への呼び出しを再評価する必要性について知りませんでした。リロードされたワークフローでは、ほとんどの時間がかかりました:) – expez

2

定義されていない仕様を使用しようとすると、specがエラーになります。

現在、spec'edでないものについてあなたに伝える方法はありません。そうするには、すべてのバールを装備(交換)し、そのチェックを追加する必要があります。

あなたの仕様が変わっている場合は、その述部を使用しているユーザーを検索し、その仕様または元の述部を使用する各製品をテストしてみます。アップ時には人をトリップ

一つはstest/instrumentのみの機能の:argsスペックではなく、(だけstest/checkで使用されている):retまたは:fnスペックをチェックするということです。ここで

+0

トップレベルのスペックのエラーは、ネストされたスペックではなく、エラーになります。 私が抱えている問題は 's/keys'仕様の一部として' :: foo'を変更したときです。 – expez

関連する問題