首页 > 解决方案 > Clojure 单元测试问题

问题描述

我目前在我的主文件中有一个函数,它可以对列表中的每个数字进行平方,现在它可以完美地工作,没有错误,但是我的单元测试不断抛出错误,我似乎无法弄清楚为什么。

 (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')

非常不确定如何进行,任何帮助表示赞赏:)

标签: clojure

解决方案


语法错误在第 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])

:require这会尝试在文字向量中查找关键字[clojure.string :as string]——前导引号 ( ') 阻止评估,因此它是一个符号 ( clojure.string),后跟一个关键字 ( :as),后跟另一个符号 ( string)。在向量中查找关键字:require将返回nil

我希望您尝试做的是:

(ns squareone.core
  (:require [clojure.string :as string]))

注意括号的位置::require表格是ns声明的一部分。

此时,您应该能够删除第 3 行并继续进行测试。

为什么第 3 行是非法的?

引号 ( ') 是包装表单的简写,(quote ..)这反过来又会阻止评估。您在第 3 行中有三个引号,因此它扩展为:

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

外引号阻止评估,因此传递给require函数的参数是:[(quote clojure.string) :as (quote str)]它是一个向量,包含一个包含两个符号 ( quoteand clojure.string) 的列表、一个关键字 ( :as) 和另一个包含两个符号的列表。但require希望这些插槽中只有一个符号,如下所示:

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

这就是你得到的错误: expected clojure.lang.Symbolbut got clojure.lang.PersistentList


推荐阅读