專案通常需要將自訂的比對程式碼封裝起來,以便在多個規格中使用。以下是建立相容於 Jasmine 的自訂比對器的步驟:
自訂比對器在最基本的形式下是一個比較函數,會取得一個「實際值」和一個「預期值」。這個函式會傳回 Jasmine,理想情況是透過呼叫 beforeEach ,並且會在給定 describe 呼叫中的所有規格內具備作用領域且可供使用。自訂比對器會在規格之間被終止。函式的名稱會是呼叫 expect 傳回值中所公開的比對器名稱。
|
|
此物件有一個名為「toBeGoofy」的自訂比對器。
|
|
比對器函式
自訂比對器函式會傳入一個 matchersUtil 參數,其中包含一組供比對器使用的工具函數,用於執行任務(例如,判斷兩個物件是否相等,請參閱:MatchersUtil 的參考文件)。透過在適當的地方使用 MatchersUtil ,自訂比對器可以與 自訂等值測試器 和 自訂物件格式化器 配合運作,而無需執行任何額外的步驟。
第二個 customEqualityTesters 參數會傳入,以相容於 Jasmine 3.5 和更早的版本。為 Jasmine 3.6 和更新版本撰寫的比對器應略過此參數。此參數在 Jasmine 4 中將不再提供。
|
toBeGoofy: function(matchersUtil) {
|
函式方法應傳回一個具有 compare 函數的物件,此函數會被呼叫來檢查預期值。
|
|
一個用於「比較」的函數
比較函數會收到作為第一個引數傳入 expect() 的值(即實際值),而第二個引數會收到傳入比對器本身的值(如果有的話)。
|
compare: function(actual, expected) {
|
toBeGoofy 會取用自訂的 expected 引數,所以如果沒有傳入,請在此定義它。
|
if (expected === undefined) {
expected = '';
}
|
結果
compare 函數必須傳回一個具有 pass 屬性的結果物件,其中 pass 屬性是比對器的布林結果。pass 屬性會告知預期值比對器是否成功(true )或失敗(false )。如果預期值以 .not 呼叫/串連,預期值會否定此值,以判斷是否符合預期值。
|
|
toBeGoofy 會測試實際值的 hyuk 屬性等於預期值,以查看它是否符合預期。
|
result.pass = matchersUtil.equals(actual.hyuk,
"gawrsh" + expected);
|
錯誤訊息
如果保留為 undefined ,預期值會嘗試為比對器建立一個錯誤訊息。不過,如果傳回值具有 message 屬性,系統在預期值失敗時會使用該訊息。
|
|
比對器成功,因此負面預期值的情況應存在自訂錯誤訊息(即在預期值與 .not 一起使用時)。
|
result.message = "Expected " + actual +
" not to be quite so goofy";
} else {
|
比對器失敗,因此正面預期值的情況應存在自訂錯誤訊息。
|
result.message = "Expected " + actual +
" to be goofy, but it was not very goofy";
}
|
傳回比較結果。
|
|
自訂負面比對器
如果您需要更嚴格地控制負面比較值(not 案例)而非僅使用上述簡單的布林反轉,您也可以讓比對器函式包含另一個金鑰 negativeCompare (與 compare 並排),其值是一個函數,在使用 .not 時會呼叫。此函數/金鑰是選用的。
|
|
註冊與使用
|
describe("Custom matcher: 'toBeGoofy'", function() {
|
使用 Jasmine 註冊自訂比對器。傳入物件的所有屬性都可用做自訂比對器(例如,在本案例中為 toBeGoofy )。
|
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
|
當自訂比對器註冊至 Jasmine 後,它會顯示在任何預期值上。
|
it("is available on an expectation", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy();
});
it("can take an 'expected' parameter", function() {
expect({
hyuk: 'gawrsh is fun'
}).toBeGoofy(' is fun');
});
it("can be negated", function() {
expect({
hyuk: 'this is fun'
}).not.toBeGoofy();
});
});
|