1

次の Midje テストを作成しました。

(fact (followers-minus-friends ...name...) => ["Dude"]
      (provided (idset show-followers ...name...) => #{1 2 3}
                (idset show-friends ...name...) => #{1 2}
                (userinfos #{3}) => [{:screen_name "Dude"}]))

次の関数を (別の名前空間で) テストします。

(defn followers-minus-friends [screenname]
  (let [difference-ids (difference (idset show-followers screenname)
                                   (idset show-friends screenname))
        userinfos (userinfos difference-ids)]
    (map :screen_name userinfos)))

テストはかなり役に立たないように見えるかもしれませんが、私はミジェに慣れようとしているだけです. どういうわけか、関数 idset が実行されるだけです。これは、provided-clause で戻り値を提供することで防止したいと考えていました。これについて何が説明できるでしょうか?

編集: 上記の状況を再現したい場合に備えて、プロジェクトを Github にアップロードしました: https://github.com/Borkdude/twitter-utils

4

1 に答える 1

2

問題は、関数idsetがソース名前空間でプライベートであることです。テスト ファイルでは、テスト名前空間でインターンします。これで、同じ関数を指す2 つの異なる変数ができました。

 #'twitter-utils.core/idset
 #'twitter-utils.test.core/idset

では、provided前提条件関数を指すように 2 番目の変数をオーバーライドしています。ただし、関数followers-minus-friendsはまだ最初の var を参照しています。これはオーバーライドされないため、元の機能が得られます。

宣言を回避するための一般的なイディオムはprivate、上記のように完全な var 名を使用することです。したがって、これが機能すると予想されます。

(fact (followers-minus-friends ...name...) => ["Dude"]
      (provided (#'twitter-utils.core/idset show-followers ...name...) => #{1 2 3}
                (#'twitter-utils.core/idset show-friends ...name...) => #{1 2}
                (userinfos #{3}) => [{:screen_name "Dude"}]))

しかし、そうではありません。Midje のバグだと思います。少なくとも、それをサポートすることでどんな害があるのか​​、私にはわかりません。チケットを提出します。

現状では、公開する必要がありますidset

于 2011-11-26T21:34:11.190 に答える