Clojure 单元测试问题
Clojure unit testing issue
目前我的主文件中有一个函数可以对列表中的每个数字求平方,现在它可以完美无误地工作,但我的单元测试一直在抛出错误,我似乎无法弄清楚原因。
(ns squareone.core-test
(:require [clojure.test :refer :all]
[squareone.core :refer :all]))
(deftest Squaring
(testing "Squaring test"
(is (= [1 16] (square [1 4])))))
That is everything in my test file
这是我的主文件中减去实际平方函数的内容
(ns squareone.core)
(:require '[clojure.string :as string])
(require '['clojure.string :as 'str])
我收到这个错误
Syntax error (ClassCastException) compiling at
(C:\Users\public\squareone\src\squareone\core.clj:3:1).
class clojure.lang.PersistentList cannot be cast to class clojure.lang.Symbol
(clojure.lang.PersistentList and clojure.lang.Symbol are in unnamed module of loader 'app')
非常不确定如何进行,感谢任何帮助:)
语法错误在第 3 行,即:
(require '['clojure.string :as 'str])
我们可以在 REPL 中确认这确实是非法的:
user=> (require '['clojure.string :as 'str])
Execution error (ClassCastException) at user/eval1 (REPL:1).
class clojure.lang.PersistentList cannot be cast to class clojure.lang.Named (clojure.lang.PersistentList and clojure.lang.Named are in unnamed module of loader 'app')
您在第 3 行也有问题,但不会导致语法或运行时错误:
(:require '[clojure.string :as string])
这会尝试在文字向量 [clojure.string :as string]
中查找关键字 :require
-- 前导引号 ('
) 会阻止计算,因此它是一个符号 (clojure.string
) 后跟关键字 (:as
) 后跟另一个符号 (string
)。在向量中查找关键字 :require
将 return nil
.
我想你想做的是这样的:
(ns squareone.core
(:require [clojure.string :as string]))
注意括号所在的位置::require
形式是 ns
声明的一部分。
此时,您应该可以删除第 3 行并继续进行测试。
为什么第 3 行是非法的?
引号 ('
) 是 shorthand 用于在 (quote ..)
中包装表单,这反过来会阻止评估。第 3 行中有三个引号,因此它扩展为:
(require (quote [(quote clojure.string) :as (quote str)]))
外引号阻止计算,因此传递给 require
函数的参数是:[(quote clojure.string) :as (quote str)]
这是一个向量,包含一个列表,其中有两个符号(quote
和 clojure.string
),一个关键字(:as
),以及另一个包含两个符号的列表。但是 require
只希望在这些插槽中有一个符号,如下所示:
(require '[clojure.string :as str])
这就是您得到的错误:预期 clojure.lang.Symbol
但得到 clojure.lang.PersistentList
.
目前我的主文件中有一个函数可以对列表中的每个数字求平方,现在它可以完美无误地工作,但我的单元测试一直在抛出错误,我似乎无法弄清楚原因。
(ns squareone.core-test
(:require [clojure.test :refer :all]
[squareone.core :refer :all]))
(deftest Squaring
(testing "Squaring test"
(is (= [1 16] (square [1 4])))))
That is everything in my test file
这是我的主文件中减去实际平方函数的内容
(ns squareone.core)
(:require '[clojure.string :as string])
(require '['clojure.string :as 'str])
我收到这个错误
Syntax error (ClassCastException) compiling at
(C:\Users\public\squareone\src\squareone\core.clj:3:1).
class clojure.lang.PersistentList cannot be cast to class clojure.lang.Symbol
(clojure.lang.PersistentList and clojure.lang.Symbol are in unnamed module of loader 'app')
非常不确定如何进行,感谢任何帮助:)
语法错误在第 3 行,即:
(require '['clojure.string :as 'str])
我们可以在 REPL 中确认这确实是非法的:
user=> (require '['clojure.string :as 'str])
Execution error (ClassCastException) at user/eval1 (REPL:1).
class clojure.lang.PersistentList cannot be cast to class clojure.lang.Named (clojure.lang.PersistentList and clojure.lang.Named are in unnamed module of loader 'app')
您在第 3 行也有问题,但不会导致语法或运行时错误:
(:require '[clojure.string :as string])
这会尝试在文字向量 [clojure.string :as string]
中查找关键字 :require
-- 前导引号 ('
) 会阻止计算,因此它是一个符号 (clojure.string
) 后跟关键字 (:as
) 后跟另一个符号 (string
)。在向量中查找关键字 :require
将 return nil
.
我想你想做的是这样的:
(ns squareone.core
(:require [clojure.string :as string]))
注意括号所在的位置::require
形式是 ns
声明的一部分。
此时,您应该可以删除第 3 行并继续进行测试。
为什么第 3 行是非法的?
引号 ('
) 是 shorthand 用于在 (quote ..)
中包装表单,这反过来会阻止评估。第 3 行中有三个引号,因此它扩展为:
(require (quote [(quote clojure.string) :as (quote str)]))
外引号阻止计算,因此传递给 require
函数的参数是:[(quote clojure.string) :as (quote str)]
这是一个向量,包含一个列表,其中有两个符号(quote
和 clojure.string
),一个关键字(:as
),以及另一个包含两个符号的列表。但是 require
只希望在这些插槽中有一个符号,如下所示:
(require '[clojure.string :as str])
这就是您得到的错误:预期 clojure.lang.Symbol
但得到 clojure.lang.PersistentList
.