通常,一个项目会想封装自定义比对代码以用于多个规范。以下是创建与 Jasmine 兼容的自定义比对器的方法。
一个自定义比对器在其根部是一个比较函数,它获取一个actual 值和一个expected 值。此工厂被传递给 Jasmine,最好是在对beforeEach 的调用中并且它在给定对describe 的调用中的所有规范的范围中且可用。自定义比对器在规范之间被终止。此工厂的名称将成为在对expect 的调用的返回值上公开的比对器的名称。
|
|
此对象有一个名为“toBeGoofy”的自定义比对器。
|
|
比对器工厂
自定义比对器工厂被传递一个matchersUtil 参数,它有一组效用函数供比对器用于执行诸如确定两个对象是否相等等的任务(请参阅:MatchersUtil 以获取参考文档)。通过在适当的地方使用MatchersUtil ,自定义比对器可以与自定义相等性测试器和自定义对象格式化程序协同工作,而无需任何额外工作。
为了与 Jasmine 3.5 及更早版本兼容,传递了第二个customEqualityTesters 参数。为 Jasmine 3.6 及更高版本编写的比对器应该忽略它。它将不再在 Jasmine 4 中提供。
|
toBeGoofy: function(matchersUtil) {
|
该工厂方法应该返回一个具有一个compare 函数的对象,该函数将被调用以检查期望。
|
|
用于compare 的函数
该比较函数接收作为第一个参数传递给expect() 的值 - 实际值 - 并且(如果有的话)作为第二个参数传递给比对器本身的值。
|
compare: function(actual, expected) {
|
toBeGoofy 采用一个可选的expected 参数,因此如果没有传入,则在此处定义它。
|
if (expected === undefined) {
expected = '';
}
|
结果
这个compare 函数必须返回一个结果对象,带有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” 情况),你的比较器工厂还可以包含另一个键alongside compare 的 negativeCompare ,它的值是一个在使用 .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();
});
});
|