自訂比對器

專案通常需要將自訂的比對程式碼封裝起來,以便在多個規格中使用。以下是建立相容於 Jasmine 的自訂比對器的步驟:

自訂比對器在最基本的形式下是一個比較函數,會取得一個「實際值」和一個「預期值」。這個函式會傳回 Jasmine,理想情況是透過呼叫 beforeEach,並且會在給定 describe 呼叫中的所有規格內具備作用領域且可供使用。自訂比對器會在規格之間被終止。函式的名稱會是呼叫 expect 傳回值中所公開的比對器名稱。

此物件有一個名為「toBeGoofy」的自訂比對器。

const customMatchers = {

比對器函式

自訂比對器函式會傳入一個 matchersUtil 參數,其中包含一組供比對器使用的工具函數,用於執行任務(例如,判斷兩個物件是否相等,請參閱:MatchersUtil 的參考文件)。透過在適當的地方使用 MatchersUtil,自訂比對器可以與 自訂等值測試器自訂物件格式化器 配合運作,而無需執行任何額外的步驟。

第二個 customEqualityTesters 參數會傳入,以相容於 Jasmine 3.5 和更早的版本。為 Jasmine 3.6 和更新版本撰寫的比對器應略過此參數。此參數在 Jasmine 4 中將不再提供。

    toBeGoofy: function(matchersUtil) {

函式方法應傳回一個具有 compare 函數的物件,此函數會被呼叫來檢查預期值。

        return {

一個用於「比較」的函數

比較函數會收到作為第一個引數傳入 expect() 的值(即實際值),而第二個引數會收到傳入比對器本身的值(如果有的話)。

            compare: function(actual, expected) {

toBeGoofy 會取用自訂的 expected 引數,所以如果沒有傳入,請在此定義它。

                if (expected === undefined) {
                    expected = '';
                }

結果

compare 函數必須傳回一個具有 pass 屬性的結果物件,其中 pass 屬性是比對器的布林結果。pass 屬性會告知預期值比對器是否成功(true)或失敗(false)。如果預期值以 .not 呼叫/串連,預期值會否定此值,以判斷是否符合預期值。

                const result = {
                };

toBeGoofy 會測試實際值的 hyuk 屬性等於預期值,以查看它是否符合預期。

                result.pass = matchersUtil.equals(actual.hyuk, 
                    "gawrsh" + expected);

錯誤訊息

如果保留為 undefined,預期值會嘗試為比對器建立一個錯誤訊息。不過,如果傳回值具有 message 屬性,系統在預期值失敗時會使用該訊息。

                if (result.pass) {

比對器成功,因此負面預期值的情況應存在自訂錯誤訊息(即在預期值與 .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";
                }

傳回比較結果。

                return result;
            }
        };
    }
};

自訂負面比對器

如果您需要更嚴格地控制負面比較值(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();
    });
});