共计 4866 个字符,预计需要花费 13 分钟才能阅读完成。
power-assert
什么是 power-assert
用官网的话答复
- 是 JavaScript 中“Power Assert”概念的实现。
- 通过规范断言接口提供描述性断言音讯。
- 没有 API 就是最好的 API。应用 power-assert,您无需学习许多断言库 API(在大多数状况下,您须要记住的只是一个 assert(any_expression) 函数)
- 进行记忆大量的断言 API。只需创立返回或不返回实在值的表达式,power-assert 将在屏幕上将其作为失败音讯的一部分显示给您,而您基本无需输出音讯。
-
power-assert 的外围价值是相对的简略和稳固。特地是,power-assert 保持最简略的测试模式
github 地址: power-assert
前言
这个库在 github 最初一次更新是在 6 个月前,npm 上最初一次更新在 3 年前,所以不是很推在荐企业级我的项目中应用,倡议只在集体或小型我的项目中应用,如果您须要足够稳固,齐全可用于生产的测试库的话,无妨去看看 Jest
power-assert 相较于许多常见的断言库最大的特点是简略弱小,并未提供很多 api,上手非常简单,且易于迁徙
这篇文章会波及 power-assert 根本的浏览器和 nodejs 示例,不会波及简单的示例
根本示例
调用 assert() 传入 一个表达式 和 一个错误信息(可选),如果表达式值为真,则没有动作,如果值为假,则显示第二个参数传入的错误信息以及一些有用的表达式的信息
咱们轻易写一个失败的测试
const assert = require("assert");
const obj = {a: {c: 4} };
const arr = [1,2,34,6,7, {a: [5,7]}]
assert(obj.a.c === arr[5].a[1], "断言谬误");
power-assert 只须要间接导入 assert 模块
在运行之前须要通过一些解决 (会主动转换为 power-assert),下文会具体解说,这里咱们先看一下输入后果
/root/RemoteWorking/powerAssert_/node_modules/empower/index.js:80
throw e;
^
AssertionError [ERR_ASSERTION]: 断言谬误 # ./test/index.js:7
assert(obj.a.c === arr[5].a[1], "断言谬误")
| | | | | | ||
| | | | | | |7
| | | | | | [5,7]
| | | | | Object{a:#Array#}
| | | | [1,2,34,6,7,#Object#]
| | 4 false
| Object{c:4}
Object{a:#Object#}
[number] arr[5].a[1]
=> 7
[number] obj.a.c
=> 4
at Decorator._callFunc (/root/RemoteWorking/powerAssert_/node_modules/empower-core/lib/decorator.js:114:29)
at Decorator.concreteAssert (/root/RemoteWorking/powerAssert_/node_modules/empower-core/lib/decorator.js:103:17)
at decoratedAssert (/root/RemoteWorking/powerAssert_/node_modules/empower-core/lib/decorate.js:49:30)
at powerAssert (/root/RemoteWorking/powerAssert_/node_modules/empower-core/index.js:63:32)
at Object.<anonymous> (/root/RemoteWorking/powerAssert_/test/assert.js:41:1)
at Module._compile (node:internal/modules/cjs/loader:1103:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '==',
powerAssertContext: {
source: {content: 'assert(obj.a.c === arr[5].a[1]," 断言谬误 ")',
filepath: './test/index.js',
line: 7
},
args: [
{
value: false,
events: [{ value: [Object], espath: 'arguments/0/left/object/object' },
{value: [Object], espath: 'arguments/0/left/object' },
{value: 4, espath: 'arguments/0/left'},
{value: [Array],
espath: 'arguments/0/right/object/object/object'
},
{value: [Object],
espath: 'arguments/0/right/object/object'
},
{value: [Array], espath: 'arguments/0/right/object' },
{value: 7, espath: 'arguments/0/right'},
{value: false, espath: 'arguments/0'}
]
}
]
}
}
能够看出,power-assert 会输入表达式每个局部的值,下方还输入了该表达式更加具体的上下文信息,提供了极具参考价值的信息,在很多状况下,咱们不再须要像其它测试库一样手动打印信息
疾速上手
疾速体验
能够应用官网示例疾速体验 power-assert
nodejs 示例: power-assert-node-seed
浏览器示例:power-assert-karma-seed
举荐用法
nodejs
nodejs 如果须要测试的文件很少,能够应用 espower-cli 间接转换代码
仅需先装置 espower-cli
而后: espower 源文件 > 输入指标文件
之后运行已转换的代码即可
像上面一样
npm install espower-cli
espower ./test/some_test.js > ./build/test/some_test.js
node ./build/test/some_test.js
也能够配置一些工具做简略的自动化
对于我的项目中应用,还是倡议应用 babel-preset-power-assert 转换代码,而后再运行测试,能够应用专门的测试工具,比方官网示例中的 mocha,也能够自行配置测试
浏览器应用
因为 power-assert 自身是 nodejs 模块,不反对浏览器
所以官网提供了 espowerify 来反对在浏览器中应用 power-assert
浏览器中断言谬误,谬误反馈会打印在浏览器的控制台,相比 nodejs 查看与调试更加不便
举荐做法
举荐做法在后期略微繁琐,但实用于许多官网示例之外状况
因为大多数状况下咱们不会应用 browserify,所以咱们能够依据官网的示例,稍作解决,制作一个浏览器通用的 power-assert 模块,这样能够在任何中央导入应用,剩下配置 babel babel-preset-power-assert 转换代码即可应用
上面是具体的浏览器 power-assert 模块制作步骤(如果您不想本人制作,能够移至文章开端下载已制作结束的模块)
power-assert 官网文档提到了通过 espowerify 反对浏览器
咱们能够将其打包为一个浏览器可间接导入的模块,以供咱们在不同的我的项目中应用
对于 assert 办法咱们间接导入自行打包好了的反对浏览器的 power-assert 模块就好
而咱们只须要转换对应测试代码即可应用 power-assert
打包步骤
1. 通过 browserify + espowerify 将 power-assert 打包为浏览器可用的模块 (须要装置 browserify, espowerify, power-assert)
1. 模块间接这么写 // power-assert.js
const assert = require("assert");
module.exports = assert;
2. 用 browserify 打包该模块,即打包蕴含 power-assert 的模块,browserify 会转换某些 node 内置模块到, 应用 polyfill 在浏览器中 (power-assert 用到了 util, buffer, assert 三个 node 内置模块)
运行命令转换:
browserify -t espowerify 下面的文件地址 > 导出地址
这一步完结之后失去了打包结束的文件,但 brwoserify 没有将模块导出,所以上面须要手动导出
2. 手动增加 esm 格局的模块导出 (批改上一步打包结束的文件)
1. 在顶部增加:let assert;
底部找到 require('power-assert'), 这里的 require 并不是 node 的原生函数,而是一个自定义函数, 能够失去可用的 power-assert 模块
2. 将:
const assert = require("assert");
module.exports = assert;
这两行替换为:
assert = require("assert");
从而将模块赋值给上方定义的 assert 变量
3. 在底部增加:export default assert;
从而导出了咱们须要的模块,至此,打包曾经实现,该模块曾经在浏览器可用(可自在导入导出应用)3. 压缩解决【举荐】(可选), 应用你喜爱的工具压缩代码
因为后续频繁应用该文件,故应用 rollup + terser 压缩代码使其更小
参考 rollup 配置:
// 压缩代码
import {terser} from 'rollup-plugin-terser';
// rollup.config.js
export default {
input: '文件地址',
output: {
file: '导出地址',
format: 'esm'
},
plugins: [terser(),
]
};
你也能够应用其余工具,这里举荐能够用 esbuild 疾速压缩
执行:esbuild 文件门路 --minify --outfile= 导出门路
即可生成文件
亲测 rollup 压缩进去的文件 273KB, 但 esbuild 压缩进去的是 280KB,如要频繁应用,倡议 rollup + terser 压缩代码
通过以上步骤,咱们就制作了一个浏览器通用的 power-assert 模块
前面,咱们就能够在本人的我的项目中导入应用
就像上面一样
import assert from "模块地址";
assert("表达式");
与下面代码的区别只是顶部的导入
而对于代码转换的局部,咱们则是配置 babel 来实现
这样,无论是在 webpack,rollup,parcel 亦或是其它工具,咱们也能够应用 power-assert 了
最初
下面的例子在浏览器中应用比拟繁琐
您能够 间接下载 已制作结束的模块用于浏览器
因为 power-assert 相干工具较少,所以应用起来可能有些麻烦,做好后期解决,在前面就能够欢快地应用了