Midje,提供不按我的预期工作

时间:2011-11-11 19:47:36

标签: clojure midje

我写过以下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)))

测试可能看起来很无用,但我只是想习惯Midje。不知何故,函数idset刚刚执行,我想通过在provided子句中提供返回值来防止这种情况。对此有什么解释?

编辑:我已将项目上传到Github,以防您想尝试重现以上情况:https://github.com/Borkdude/twitter-utils

1 个答案:

答案 0 :(得分:2)

问题是函数idset在源名称空间中是私有的。在测试文件中,您可以在测试命名空间中实习它。您现在有两个指向相同功能的不同变量:

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

provided中,您将覆盖第二个var以指向先决条件函数。但是,函数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