unit-testing - 当结果是函数时,无法测试为真(编译时出现语法错误。没有这样的 var:...)
问题描述
当我想测试结果是另一个函数的函数时发生。我有这样的事情:
ns flexsearch.core
(defn init [{:keys [tokenizer split indexer filter] :as options}]
(let [encoder (get-encoder (:encoder options))]
(assoc (merge {:ids {} :data {}} options)
:indexer (get-indexer indexer)
:encoder encoder
:tokenizer (if (fn? tokenizer) tokenizer #(string/split % (or split #"\W+")))
:filter (set (mapv encoder filter)))))
在测试中:
ns flexsearch.core-test
[flexsearch.core :as f]
(def split #"\W+")
(is (= (f/init {:tokenizer false :split split :indexer :forward :filter #{"and" "or"}})
{:ids {},
:data {},
:tokenizer f/init/fn--14976,
:split #"\W+",
:indexer f/index-forward,
:filter #{"or" "and"},
:encoder f/encoder-icase}))
repl 中的结果是:
{:ids {},
:data {},
:tokenizer #function[flexsearch.core/init/fn--14976],
:split #"\W+",
:indexer #function[flexsearch.core/index-forward],
:filter #{"or" "and"},
:encoder #function[flexsearch.core/encoder-icase]}
我知道我必须放 f/index-forward 而不是 repl [flexsearch.core/index-forward] 的结果,但它不适用于 f/init/fn--14976 (No such var: f /init/fn--14976)
我认为这是 vars 的一个技巧,但我不知道它是如何工作的。你能提供的任何读物我将不胜感激
---编辑--- f/index-forward 和 f/encoder-icase 符号工作正常。
---编辑2---我已经定义:
(defn spliter [split] (fn [x] (string/split x (or split #"\W+"))))
并将其用于:
(defn init [{:keys [tokenizer split indexer filter] :as options}]
(let [encoder (get-encoder (:encoder options))]
(assoc (merge {:ids {} :data {}} options)
:indexer (get-indexer indexer)
:encoder encoder
:tokenizer (if (fn? tokenizer) tokenizer (spliter split))
:filter (set (mapv encoder filter)))))
我得到了一个类似的“:tokenizer #function[flexsearch.core/spliter/fn--34857]”,我在测试中使用它,它也失败了——</p>
解决方案
我认为“没有这样的 var”错误正在发生,因为标记器是一个匿名函数。
如果您将默认标记器定义为非匿名函数,flexsearch.core
然后在测试中使用该名称,它将起作用。
但是,一般来说,您无法比较两个函数的相等性 - 正如@cfrick 所说。当您比较地图时,其中一些值是函数,您仍在比较函数。
推荐阅读
- powershell - 如何从 powershell 显示活动目录浏览器
- flutter - 如何在 Flutter 应用中打开 pdf、pptx、doc、docx 文件?
- python - 在 Django 中使用 python 读取 zip 文件夹中的文件时权限被拒绝错误
- javascript - 如何使用 Fabric js 以编程方式自由绘制?
- python - python中的正则表达式:将2个正则表达式组合为一个
- java - Spring Boot Security、JPA、WebMVC和Cache之间的Spring Boot循环依赖冲突
- batch-file - 批处理脚本编程:将 txt 文件中的行值保存到变量中
- android - Android kotlin 两种方式数据绑定问题
- node.js - 克隆到另一台 PC 后 Angular 无法正常工作
- javascript - JQuery onChange 使用更改前的值(需要更改后的值)