根据给定的一组规范检查给定的对象,以防止您编写样板测试。
const test = require ( 'node:test' )
// or: const test = require('tape')
// or: const test = require('tap')
const spok = require ( 'spok' )
// this would be returned from a function you are testing
const object = {
one : 1
, two : 2
, three : 3
, four : 4
, helloWorld : 'hello world'
, anyNum : 999
, anotherNum : 888
, anArray : [ 1 , 2 ]
, anotherArray : [ 1 , 2 , 3 ]
, anObject : { }
}
// custom specification
function hasThreeElements ( a ) {
return a . length === 3
}
test ( 'my object meets the specifications' , ( t ) => {
spok ( t , object , {
$topic : 'spok-example'
, one : spok . ge ( 1 )
, two : 2
, three : spok . range ( 2 , 4 )
, four : spok . lt ( 5 )
, helloWorld : spok . startsWith ( 'hello' )
, anyNum : spok . type ( 'number' )
, anotherNum : spok . number
, anArray : spok . array
, anotherArray : hasThreeElements
, anObject : spok . ne ( undefined )
} )
} )
npm install spok
从 Node.js 16.x 开始,它包含一个内置的测试运行器。
Spok 开箱即用地支持此功能,如下所示:
assert
模块来断言值t: TestContext
来打印详细说明断言的诊断消息 mad有关完整示例,请参阅 ./example/node-test.js 和 ./example/node-test-nested.js。
spok检测是否应在输出中使用颜色,以避免在需要时破坏 TAP 兼容性,如下所示:
FORCE_COLOR
环境变量设置为1|true
彩色NO_COLOR
环境变量设置为1|true
彩色node --test mytest.js
执行测试并且未设置FORCE_COLOR
则禁用 colorenode mytest.js
执行测试并且未设置NO_COLOR
则启用颜色t
,它镜像了assert
模块,并且还将结果和诊断消息打印到控制台,因此 spok 使用t
来执行断言有关完整示例,请参阅 ./example/tape.js 和 ./example/tape-nested.js。
Spok 可以与expect
一起开箱即用,例如使用 cypress.io 运行测试时。
只需创建一个自定义断言函数并将其传递给 spok 即可。与使用tape
运行测试的主要区别在于,如果比较对象中的单个属性不匹配,则测试会立即失败。
import spok from 'spok'
const t = spok . adapters . chaiExpect ( expect )
spok ( t , meta , {
err : null ,
fee : 5000 ,
status : {
Ok : null ,
} ,
} )
spok ( t , meta , {
err : null ,
fee : 4000 ,
status : {
Ok : null ,
} ,
} )
deepEqual
呢? deepEqual
在大多数情况下效果很好,但在某些情况下您需要更多控制,即
默认情况下,spok 打印特定断言满足的规范,即satisfies: spok.range(2, 4)
。您可以通过spok.printSpec = false
将其关闭。
另一方面,如果您想要有关满足规范的更多详细信息,请执行spok.printDescription = true
而不是让 spok 打印satisfies: spok.range(2, 4) 2 <= value <= 4
。
规格和描述以灰色打印,因此您可以专注于测试输出的实际值。
使用 DocToc 生成的目录
spok提供了一些常用的规范函数。不过,您也可以编写自己的函数,如果满足规范则返回true
,如果不满足则返回false
(请参见上面的示例)。
如果您编写的规范函数对其他人有用,请将其与测试一起添加并提供 PR。
spok.*
比较函数名称源自bash比较运算符,以便更容易记住。
根据对象检查给定的规格。
运行测试时,会打印实际值以进行视觉验证,同时验证每个提供的规范,如果其中之一失败,则会导致测试失败。
参数
t
具有断言函数equal
和deepEqual
(用于比较对象)的对象- 使用tap 、 Tape 、 assert 、 Node.js TestContext或任何其他具有这些功能的库,因此是兼容的obj
对象用于验证规范的对象specifications
反对规格以验证spok
的版本对规范类型的关系不太严格,即它允许手动覆盖类型或从提供的参数派生类型。
仅当您无法调整类型时才使用,因此普通spok
即可。
指定给定数字在给定范围内,即min<= x <=max
。
var spec = {
x : spok . range ( 1 , 2 ) // specifies that x should be >=1 and <=2
}
参数
min
最小数量max
数量最大指定一个数字大于给定的条件。
var spec = {
x : spok . gt ( 1 ) // specifies that x should be >1
}
参数
n
数量标准指定数字大于或等于给定标准。
var spec = {
x : spok . ge ( 1 ) // specifies that x should be >=1
}
参数
n
数量标准指定一个数字小于给定的标准。
var spec = {
x : spok . lt ( 1 ) // specifies that x should be < 1
}
参数
n
数量标准指定一个数字小于或等于给定的标准。
var spec = {
x : spok . le ( 1 ) // specifies that x should be <=1
}
参数
n
数量标准指定该值不等于另一个值。
var spec = {
x : spok . ne ( undefined ) // specifies that x should be defined
}
参数
value
任何标准指定该值大于零
var spec = {
x : spok . gtz
}
指定该值大于或等于零
var spec = {
x : spok . gez
}
指定该值小于零
var spec = {
x : spok . ltz
}
指定该值小于或等于零
var spec = {
x : spok . lez
}
指定输入属于给定类型。
var spec = {
x : spok . type ( 'number' ) // specifies that x should be a Number
}
参数
t
字符串预期类型指定输入是一个数组。
var spec = {
x : spok . array // specifies that x should be an Array
}
指定输入是具有特定数量元素的数组
var spec = { x: spok.arrayElements(2) // 指定 x 应该是一个有 2 个元素的数组 }
参数
n
元素数量指定输入是一个数组,其中包含给定范围内的多个元素
var spec = { x: spok.arrayElementsRange(2, 4) // 指定 x 应该是一个包含 2-4 个元素的数组 }
参数
min
Number元素的最小数量max
Number元素的最大数量指定 number 类型和isNaN(x)
的输入返回false
。
var spec = {
x : spok . number // specifies that x should be a Number
}
指定输入是字符串。
var spec = {
x: spok.string // specifies that x should be a String
}
指定输入是一个函数。
var spec = {
x: spok.function // specifies that x should be a function
}
指定输入是一个对象且不为null
。
var spec = {
x : spok . definedObject // specifies that x is a non-null object
}
指定字符串以指定的子字符串开头。
注意:仅适用于具有startsWith
函数的 Node.js
var spec = {
x : spok . startsWith ( 'hello' ) // specifies that x should start with 'hello'
}
参数
what
字符串子字符串开头指定字符串以指定的子字符串结尾。
注意:仅适用于具有endsWith
函数的 Node.js
var spec = {
x : spok . endsWith ( 'hello' ) // specifies that x should start with 'hello'
}
参数
what
字符串子字符串开头指定字符串需要与给定的正则表达式匹配。
var spec = {
x : spok . test ( / hello$ / ) // specifies that x should match /hello$/
}
参数
regex
RegExp正则表达式,通过test
检查字符串指定一个值已定义,即它既不是null
也不是undefined
。
var spec = {
x : spok . defined
}
指定一个值不是 notDefined ,即它为null
或notDefined
。
var spec = {
x : spok . notDefined
}
麻省理工学院