外掛程式工具
外掛程式工具適用於想要使用自己的一組斷言來擴展 Chai 的使用者。核心外掛程式概念和建立輔助程式指南教學是關於如何開始使用自己的斷言的絕佳參考。
API 參考
.addChainableMethod(ctx, name, method, chainingBehavior)
將方法新增至物件,以便該方法也可以鏈式呼叫。
utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.equal(str);
});
也可以直接從 chai.Assertion
存取。
chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);
然後,結果可以用作方法斷言,執行 method
和 chainingBehavior
,或作為語言鏈,僅執行 chainingBehavior
。
expect(fooStr).to.be.foo('bar');
expect(fooStr).to.be.foo.equal('foo');
.addLengthGuard(fn, assertionName, isChainable)
將 length
定義為給定未調用方法斷言上的 getter。該 getter 作為防止直接從未調用方法斷言鏈式呼叫 length
的保護機制,這是一個問題,因為它引用 function
的內建 length
屬性,而不是 Chai 的 length
斷言。當 getter 捕捉到使用者犯下這個錯誤時,它會拋出一個帶有說明訊息的錯誤。
有兩種方式會犯這個錯誤。第一種方式是直接從未調用的可鏈式呼叫方法鏈式呼叫 length
斷言。在這種情況下,Chai 建議使用者改用 lengthOf
。第二種方式是直接從未調用的不可鏈式呼叫方法鏈式呼叫 length
斷言。必須先調用不可鏈式呼叫方法,然後才能鏈式呼叫。在這種情況下,Chai 建議使用者查閱給定斷言的文件。
如果函式的 length
屬性是不可設定的,則傳回未經修改的 fn
。
請注意,在 ES6 中,函式的 length
屬性是可設定的,因此一旦不再支援舊環境,Chai 的 length
屬性就可以取代內建函式的 length
屬性,而且這個長度保護機制將不再必要。同時,在所有環境中保持一致性是優先事項。
.addMethod(ctx, name, method)
將方法新增至物件的原型。
utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.equal(str);
});
也可以直接從 chai.Assertion
存取。
chai.Assertion.addMethod('foo', fn);
然後可以像任何其他斷言一樣使用。
expect(fooStr).to.be.foo('bar');
.addProperty(ctx, name, getter)
將屬性新增至物件的原型。
utils.addProperty(chai.Assertion.prototype, 'foo', function () {
var obj = utils.flag(this, 'object');
new chai.Assertion(obj).to.be.instanceof(Foo);
});
也可以直接從 chai.Assertion
存取。
chai.Assertion.addProperty('foo', fn);
然後可以像任何其他斷言一樣使用。
expect(myFoo).to.be.foo;
.compareByInspect(mixed, mixed)
要用作 Array.prototype.sort 的 compareFunction。使用 inspect 而不是使用 toString 的預設行為來比較元素,以便即使是具有不規則/遺失 toString 的符號和物件,仍然可以進行排序,而不會出現 TypeError。
.expectTypes(obj, types)
確保要測試的物件是有效的類型。
utils.expectTypes(this, ['array', 'object', 'string']);
.flag(object, key, [value])
在物件上取得或設定旗標值。如果提供值,則將設定該值,否則將傳回目前設定的值,如果未設定該值,則傳回 undefined
。
utils.flag(this, 'foo', 'bar'); // setter
utils.flag(this, 'foo'); // getter, returns `bar`
.getActual(object, [actual])
傳回斷言的 actual
值。
.getMessage(object, message, negateMessage)
根據旗標和範本標籤建構錯誤訊息。範本標籤將傳回所參照物件的字串化檢查結果。
訊息範本標籤
#{this}
目前斷言的物件#{act}
實際值#{exp}
預期值
.getOperator(message)
從錯誤訊息中擷取運算子。定義的運算子基於以下連結 https://node.dev.org.tw/api/assert.html#assert_assert。
傳回斷言的 operator
或 undefined
值。
.getOwnEnumerableProperties(object)
這允許擷取物件的直接擁有的可列舉屬性名稱和符號。此函式是必要的,因為 Object.keys 只會傳回可列舉的屬性名稱,而不會傳回可列舉的屬性符號。
.getOwnEnumerablePropertySymbols(object)
這允許擷取物件的直接擁有的可列舉屬性符號。此函式是必要的,因為 Object.getOwnPropertySymbols 會傳回可列舉和不可列舉的屬性符號。
.getProperties(object)
這允許擷取物件的屬性名稱,無論是否可列舉,也無論是否繼承。
.inspect(obj, [showHidden], [depth], [colors])
回應值的內容。嘗試以盡可能最好的方式列印出該值,具體取決於不同的類型。
.isProxyEnabled()
協助程式函式,用於檢查是否啟用了 Chai 的 Proxy 保護功能。如果代理伺服器不受支援或透過使用者的 Chai 設定停用,則傳回 false。否則,傳回 true。
.objDisplay(object)
判斷物件或陣列是否符合在錯誤訊息中內嵌檢查或截斷的條件。
.overwriteChainableMethod(ctx, name, method, chainingBehavior)
覆寫已存在的鏈式方法,並提供對先前函式或屬性的存取。必須回傳將用於名稱的函式。
utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf',
function (_super) {
}
, function (_super) {
}
);
也可以直接從 chai.Assertion
存取。
chai.Assertion.overwriteChainableMethod('foo', fn, fn);
然後可以像任何其他斷言一樣使用。
expect(myFoo).to.have.lengthOf(3);
expect(myFoo).to.have.lengthOf.above(3);
.overwriteMethod(ctx, name, fn)
覆寫已存在的方法,並提供對先前函式的存取。必須回傳將用於名稱的函式。
utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {
return function (str) {
var obj = utils.flag(this, 'object');
if (obj instanceof Foo) {
new chai.Assertion(obj.value).to.equal(str);
} else {
_super.apply(this, arguments);
}
}
});
也可以直接從 chai.Assertion
存取。
chai.Assertion.overwriteMethod('foo', fn);
然後可以像任何其他斷言一樣使用。
expect(myFoo).to.equal('bar');
.overwriteProperty(ctx, name, fn)
覆寫已存在的屬性 getter,並提供對先前值的存取。必須回傳一個用作 getter 的函式。
utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {
return function () {
var obj = utils.flag(this, 'object');
if (obj instanceof Foo) {
new chai.Assertion(obj.name).to.equal('bar');
} else {
_super.call(this);
}
}
});
也可以直接從 chai.Assertion
存取。
chai.Assertion.overwriteProperty('foo', fn);
然後可以像任何其他斷言一樣使用。
expect(myFoo).to.be.ok;
.proxify(object)
回傳給定物件的代理,當讀取不存在的屬性時會拋出錯誤。預設情況下,根本原因被假定為屬性拼寫錯誤,因此會嘗試從現有屬性清單中提供合理的建議。然而,如果提供了 nonChainableMethodName,則根本原因反而是未能在讀取不存在的屬性之前呼叫非鏈式方法。
如果代理不支援或透過使用者的 Chai 設定停用,則回傳未修改的物件。
.test(object, expression)
測試物件是否符合表達式。
.transferFlags(assertion, object, includeAll = true)
將 assertion
的所有旗標傳輸到 object
。如果 includeAll
設定為 false
,則基本 Chai 斷言旗標(即 object
、 ssfi
、lockSsfi
和 message
)將不會被傳輸。
var newAssertion = new Assertion();
utils.transferFlags(assertion, newAssertion);
var anotherAssertion = new Assertion(myObj);
utils.transferFlags(assertion, anotherAssertion, false);
.compatibleInstance(thrown, errorLike)
檢查兩個實例是否相容(嚴格相等)。如果 errorLike 不是 Error 的實例,則回傳 false,因為只有當兩個都是錯誤實例時,實例才相容。
.compatibleConstructor(thrown, errorLike)
檢查兩個建構子是否相容。此函式可以接收錯誤建構子或錯誤實例作為 errorLike
引數。如果建構子相同,或一個是另一個的實例,則建構子相容。
.compatibleMessage(thrown, errMatcher)
檢查錯誤訊息是否與比對器(字串或正規表示式)相容。如果訊息包含字串或通過正規表示式測試,則認為它是相容的。
.getConstructorName(errorLike)
取得 Error 實例或建構子本身的建構子名稱。
.getMessage(errorLike)
從錯誤中取得錯誤訊息。如果 err
本身是字串,我們將回傳它。如果錯誤沒有訊息,我們將回傳一個空字串。
.getFuncName(constructorFn)
回傳函式的名稱。當傳遞非函式實例時,回傳 null
。這也包含一個 polyfill 函式,如果 aFunc.name
未定義。
.getFuncName(constructorFn)
回傳函式的名稱。當傳遞非函式實例時,回傳 null
。這也包含一個 polyfill 函式,如果 aFunc.name
未定義。
.hasProperty(object, name)
這允許檢查物件是否擁有自有或從原型鏈繼承的指定名稱屬性。
基本上與 in
運算子執行相同的操作,但可以正確地處理 null/undefined 值和其他基本類型。
var obj = {
arr: ['a', 'b', 'c']
, str: 'Hello'
}
以下是結果。
hasProperty(obj, 'str'); // true
hasProperty(obj, 'constructor'); // true
hasProperty(obj, 'bar'); // false
hasProperty(obj.str, 'length'); // true
hasProperty(obj.str, 1); // true
hasProperty(obj.str, 5); // false
hasProperty(obj.arr, 'length'); // true
hasProperty(obj.arr, 2); // true
hasProperty(obj.arr, 3); // false
.getPathInfo(object, path)
這允許在給定字串路徑的情況下,擷取物件中的屬性資訊。
路徑資訊由具有以下屬性的物件組成
- parent - 由
path
引用的屬性的父物件 - name - 最後屬性的名稱,如果是陣列索引則為數字
- value - 屬性的值,如果存在,否則為
undefined
- exists - 屬性是否存在
.getPathValue(object, path)
這允許在給定字串路徑的情況下,擷取物件中的值。
var obj = {
prop1: {
arr: ['a', 'b', 'c']
, str: 'Hello'
}
, prop2: {
arr: [ { nested: 'Universe' } ]
, str: 'Hello again!'
}
}
以下是結果。
getPathValue(obj, 'prop1.str'); // Hello
getPathValue(obj, 'prop1.att[2]'); // b
getPathValue(obj, 'prop2.arr[0].nested'); // Universe