我很难在 Clojure 中使用 with-redefs
在 Windows 上进行模拟来创建简单的单元测试。测试代码、我要测试的函数和要模拟的函数都在不同的命名空间/文件中:
待测函数:
(ns com.mynamespace.a
(:require [com.mynamespace.b :as b] ) )
(defn afunc [param]
(b/bfunc param))
要模拟的依赖 b 命名空间:
(ns com.mynamespace.b)
(defn bfunc [param]
; External call
)
测试代码
(ns com.mynamespace.a-test
(:require [com.mynamespace.a :as a]
[com.mynamespace.b :as b] )
(:use [clojure.test]))
(deftest a-tests
(with-redefs [b/bfunc (constantly "dummy")]
(print (a/afunc "test"))
)
)
我认为我正确地使用了 with-redefs
,因为我的单元测试在 Linux 机器(docker 容器或虚拟 Ubuntu)上运行良好,但它只是在以下情况下不起作用在我的 Windows 开发机器上执行/开发它们:with-redefs
绑定(bind)未应用并且测试想要实现,例如http 电话,我想 mock 。如果我运行 lein test
,或者尝试通过 Eclipse CCW 从 REPL 执行测试,情况也是一样的。
我知道 with-redefs 有一些奇怪的行为,但由于我的测试在 Linux 上运行良好,我想我在 Windows 上运行该项目的测试时错过了一些东西。在我的 Windows 机器上编写测试时,我想实现快速反馈循环。
你知道我做错了什么吗? 谢谢, 安德拉斯
最佳答案
由于 -Dclojure.compiler.direct-linking=true jvm-opts 标志,这个问题特定于我正在处理的项目。
关闭直接链接后,我的测试也可以在我的 Windows 开发机器上运行。我想知道为什么他们在 Linux 上通过了,但也许在运行 lein test
时没有应用。
关于unit-testing - with-redefs 在 Windows 上的特定项目中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46093502/