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)))

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

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

4

1 回答 1

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公开。

于 2011-11-26T21:34:11.190 回答