2

我很难在 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绑定没有应用并且测试想要进行真实的 http 调用,我想模拟一下。如果我运行lein test,或者尝试通过 Eclipse CCW 从 REPL 执行测试,情况也是如此。

我知道 with-redefs 有一些奇怪的行为,但是由于我的测试在 Linux 上运行良好,我想在 Windows 上运行这个项目的测试时我错过了一些东西。在我的 Windows 机器上编写测试时,我想实现快速反馈循环。

你知道我做错了什么吗?谢谢, 安德拉斯

4

1 回答 1

6

原来,由于-Dclojure.compiler.direct-linking=true jvm-opts 标志,这个问题是特定于我正在处理的项目的。

关闭直接链接后,我的测试也可以在我的 Windows 开发机器上运行。我想知道为什么他们在 Linux 上通过了,但在 Linux 上运行时可能没有应用它lein test

于 2017-09-07T14:49:44.217 回答