用`with-redefs`覆盖方法时`get`的行为

时间:2019-02-28 03:50:48

标签: clojure

我正在编写一些单元测试,为此我在模拟一些方法。我的功能如下:

(def my_map {:a 10 :b 20 :c 30})

(defn my-fn []
   (<= (get my_map :a) (get my_map :b)))

我正在模拟以下内容:

(with-redefs [my_ns/my_map (fn [] {:a 100 :b 200 :c 300})]
  #(is (= true (my-fn))) ;; other asserts using the overridden function
 )

我已经意识到使用模拟方法时,语句(get my_map :a)会抛出NullPointerException。但是,当使用原始实现以同样的方式执行该操作(不模拟)时,效果很好。

因此我意识到,如果我更改为(get (my_map) :a),则可以在模拟环境下正常工作,但会破坏原始的实现。

我在这里想念什么?我期望with-redefs仅覆盖特定方法的实现。

1 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解您要实现的目标,但是如果您的意思是在经过修改的my-fn上下文中调用my_map,则可以尝试< / p>

(with-redefs [my_map {:a 100 :b 200 :c 300}]
  (= true (my-fn)))

此表达式会临时修改my_map,然后在这个新的临时上下文中运行my-fn。其值将是my-fn与修改后的my_map的结果。

作为旁注,可以使用较短的(:a my_map)代替(get my_map :a)(请看什么是关键字)。另外,由于my-fn返回的是布尔值,因此您可以简单地使用(= true (my-fn))来代替(my-fn)