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)] 这是一个向量,包含一个列表,其中有两个符号(quoteclojure.string),一个关键字(:as),以及另一个包含两个符号的列表。但是 require 只希望在这些插槽中有一个符号,如下所示:

(require '[clojure.string :as str])

这就是您得到的错误:预期 clojure.lang.Symbol 但得到 clojure.lang.PersistentList.