根據給定的一組規格檢查給定的對象,以防止您編寫樣板測試。
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
}
麻省理工學院