Javascript测试框架Jasmine(四):自定义Matcher
2017-11-09 22:08
393 查看
zz from:http://keenwon.com/1212.html
一个项目常常需要封装自定义的Matcher来在多个spec中使用,这次讲下怎么写兼容Jasmine的自定义Matcher。
自定义的Matcher从本质上讲是一个对比函数,它的函数名就是暴露给expect调用的名称,它接受
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
if (result.pass) {
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;
}
};
}
};
自定义Matcher的构造函数接受两个参数,
构造函数需要返回一个对象,这个对象要包含名为
Matcher是否通过。如果expectation调用了
如果不指定错误信息,expectation会尝试用Matcher生成一个错误信息。但是,如果返回的result对象包含了
先看看指定
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
if (result.pass) {
result.message = "通过了,通过了,通过了...";
} else {
result.message = "没通过,没通过,没通过...";
}
return result;
}
};
}
};
describe("测试自定义错误信息", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
it("这是个失败的测试", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy(123);
});
});
在线演示
再看看没有指定
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
return result;
}
};
}
};
describe("测试自动生成的错误信息", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
it("这是个失败的测试", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy(123);
});
});
点击这里查看效果,可以看出,Jasmine把Matcher的名字,按照驼峰命名法分隔开,生成错误信息。
如果你的自定义Matcher需要控制
向Jasmine注册自定义的Matcher后,所有的expectation都可以使用该Matcher。
describe("注册'toBeGoofy'", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
//...
});
– 下一篇讲一下Jasmine里比较牛的Spies –
一个项目常常需要封装自定义的Matcher来在多个spec中使用,这次讲下怎么写兼容Jasmine的自定义Matcher。
自定义的Matcher从本质上讲是一个对比函数,它的函数名就是暴露给expect调用的名称,它接受
actual值和
expected值。这个函数会传入Jasmine作用域中,可以在
beforeEach中调用到。每次spec执行完后,都会把自定义Matchers卸载,下面看个简单例子:
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
if (result.pass) {
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;
}
};
}
};
Matcher构造函数
自定义Matcher的构造函数接受两个参数,util:给Matcher使用的一组工具函数;
customEqualityTesters:调用
util.equals的时候需要传入。
构造函数需要返回一个对象,这个对象要包含名为
compare的函数,执行Matcher时会调用
compare函数。
compare函数
compare函数接收传入
expect的值作为它的第一个参数
actual,如果存在的话,传入Matcher自己的参数会作为
compare函数的第二个参数。上例中的
toBeGoofy就会接收一个可选的
expected参数,默认不需要传入。
Result
compare函数必须返回一个结果对象。结果对象必须包含一个布尔值类型的
pass属性,告诉expectation
Matcher是否通过。如果expectation调用了
.not的话,会做相反的判断。上例中的
toBeGoofy测试实际值得
hyuk属性是否和期望值相等。
错误信息
如果不指定错误信息,expectation会尝试用Matcher生成一个错误信息。但是,如果返回的result对象包含了message属性的话,会使用
message的值作错误提示。
先看看指定
message的效果
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
if (result.pass) {
result.message = "通过了,通过了,通过了...";
} else {
result.message = "没通过,没通过,没通过...";
}
return result;
}
};
}
};
describe("测试自定义错误信息", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
it("这是个失败的测试", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy(123);
});
});
在线演示
再看看没有指定
message的效果:
var customMatchers = {
toBeGoofy: function(util, customEqualityTesters) {
return {
compare: function(actual, expected) {
if (expected === undefined) {
expected = '';
}
var result = {};
result.pass = util.equals(actual.hyuk, "gawrsh" + expected, customEqualityTesters);
return result;
}
};
}
};
describe("测试自动生成的错误信息", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
it("这是个失败的测试", function() {
expect({
hyuk: 'gawrsh'
}).toBeGoofy(123);
});
});
点击这里查看效果,可以看出,Jasmine把Matcher的名字,按照驼峰命名法分隔开,生成错误信息。
自定义“否定”比较规则
如果你的自定义Matcher需要控制.not的行为的话(不是简单的布尔值取反),那么你的Matcher构造函数里除了
compare,还可以包含另一个函数
negativeCompare。当使用了
.not的时候会执行
negativeCompare。
Matcher的注册和使用
向Jasmine注册自定义的Matcher后,所有的expectation都可以使用该Matcher。describe("注册'toBeGoofy'", function() {
beforeEach(function() {
jasmine.addMatchers(customMatchers);
});
//...
});
– 下一篇讲一下Jasmine里比较牛的Spies –
相关文章推荐
- JavaScript测试框架Jasmine学习(一)
- Javascript测试框架Jasmine(七):jqPaginator测试实例
- javaScript测试框架jasmine介绍(一)
- Javascript测试框架Jasmine(一):简介
- 进入Jasmine的世界——超强Javascript测试框架
- Javascript测试框架Jasmine(二):Matchers
- Javascript测试框架Jasmine(三):Setup、Teardown、嵌套describe等
- Javascript测试框架Jasmine(五):Spies
- JavaScript 测试框架 ( QUnit , javascript code coverage , JSCoverage , Pavlov , Jasmine )
- Jasmine-基于JavaScript的行为驱动单元测试框架简介
- Javascript测试框架Jasmine
- Javascript测试框架Jasmine(六):异步代码测试
- JavaScript测试工具之Karma-Jasmine的安装和使用详解
- Google C++测试框架系列高级篇:第二章 让GTest学习打印自定义对象
- JavaScript单元测试框架:Jasmine
- JavaScript测试工具之Karma-Jasmine的安装和使用详解
- jasmine测试框架学习笔记
- 通过Jasmine和Guard自动测试JavaScript
- JAVA反射机制自定义框架测试代码,留着以后复习用!
- JavaScript重构(九):自定义的JavaScript产品框架