clojure - 'provided' 在 Midje 的事实中是如何实现的?

标签 clojure tdd stubbing midje

我正在阅读《Clojure in Action》第 8 章有关 TDD 的内容,并尝试了 stub 宏。它使用动态绑定(bind)机制来 stub 函数。唉,在 Clojure 1.3 中,不可能对非动态变量使用绑定(bind)机制,因此 stub 宏在大多数情况下不起作用,除非您显式声明指向函数动态的 var。然后我想知道 Midje 中的 stub 是如何完成的,并试图找到“provided”的来源,但我找不到它。所以就这样:

Midje 的事实中“提供”是如何实现的?谁能详细解释一下吗?

最佳答案

Clojure 1.3 提供了一个 with-redefs 宏,甚至可以与尚未声明为动态的变量一起使用:

user=> (def this-is-not-dynamic)
user=> (with-redefs [this-is-not-dynamic 900] this-is-not-dynamic)
900

为了向后兼容,Midje 使用自己的版本,其内容如下:

(defn alter-one-root [[variable new-value]]
   (if (bound? variable) 
     (let [old-value (deref variable)]
       (alter-var-root variable (fn [current-value] new-value))
       [variable old-value])
     (do
       (.bindRoot variable new-value)
       [variable unbound-marker])))

关于clojure - 'provided' 在 Midje 的事实中是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7861469/

相关文章:

clojure - 如何在 Clojure 中测试空向量

java - 在 Haskell 或 Clojure 等函数式编程语言中,函数是如何组织的?

c# - 我应该明确断言计数还是结果?

c# - 生成特定文本文件的类的重构策略

postgresql - 如何使用 Luminus 连接到 Heroku 中的 PostgreSQL?

clojure - Clojure 中四舍五入到列表中最接近的数字

node.js - TestsNodejs - mocha 和 babel 中的编译器弃用

java - Mockito 重新 stub 方法已经用 thenthrow stub

javascript - 使用回调 stub 函数

ruby-on-rails - stub ActiveRecord 结果数组