我正在编写一些单元测试,为此我在模拟一些方法。我的功能如下:
(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
仅覆盖特定方法的实现。
答案 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)
。