【问题标题】:lein test throws NPE for function using "resolve"; works in REPLlein test 使用“resolve”为函数抛出 NPE;在 REPL 工作
【发布时间】:2016-03-15 02:58:55
【问题描述】:

lein test 在测试使用(resolve (symbol "a-fn")) 返回函数a-fn 的函数时抛出NullPointerException。测试从 REPL 运行良好。

如果确实是问题所在,我无法在 leiningen 的测试套件中找到解决 a-fn 的方法。

我通过lein new my-resolve 创建了一个名为 my-resolve 的 Leiningen 项目,并为它们添加了两个函数和测试:

src/my_resolve/core.clj:

(ns my-resolve.core)

(defn a-fn [] "From a-fn")

(defn my-resolve [] (resolve (symbol "a-fn")))

test/my_resolve/core_test.clj:

(ns my-resolve.core-test
  (:require [clojure.test :refer :all]
            [my-resolve.core :refer :all]))

;; Passes
(deftest a-fn-test
  (testing "a-fn"
    (is (= (a-fn)
           "From a-fn"))))

;; my-resolve-test behaves correctly in the REPL (the test passes,
;; returns nil) but throws a NullPointerException when called from
;; lein test.
(deftest my-resolve-test
  (testing "my-resolve"
    (is (= ((my-resolve))
           "From a-fn"))))

谢谢。

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    resolve 使用动态绑定的*ns* 委托给ns-resolve,在调用my-resolve.core/my-resolve 时会有所不同,具体取决于调用它的命名空间:

    user=> (doc resolve)
    -------------------------
    clojure.core/resolve
    ([sym] [env sym])
      same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)
    

    我假设您在 REPL 中调用 my-resolve 而在 my-resolve.core ns 中。当lein test 执行my-resolve.core-test 中的测试时,*ns* 动态绑定到(the-ns 'user),并且 ns(很可能)不包含到my-resolve 的绑定。

    【讨论】:

    • 在示例中,a-fnmy-resolve 在定义和测试方面似乎是平行的,但实际上并非如此。 lein test 正确执行 a-fn-test。你是如何让lein test 正确执行my-resolve-test 的?
    • 要让lein test 正确执行,您需要将my-resolve 函数中的代码更改为(ns-resolve 'my-resolve.core 'a-fn) 之类的代码。
    • 优秀。什么让我需要指定已经定义 my-resolve 的命名空间。
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-14
    • 2017-08-18
    • 2018-01-02
    • 2023-03-06
    相关资源
    最近更新 更多