我正在尝试编写一个自定义匹配器,用于测试字符串是否包含特殊数量的不同字符串。这就是我所做的。
var matcher = {
toContainTimes: function (expected, num) {
return {
compare: function(actual){
actual.match(new RegExp(expected, "g") || []).length == num;
}
}
}
}
但执行此操作时出错:
TypeError: Cannot read property 'pass' of undefined
我的测试看起来像这样:
expect(queryString).toContainTimes("&", 2);
如果字符串“&”,它应该返回true在queryString中恰好发生两次。 我做错了什么?
答案 0 :(得分:4)
来自Jasmine docs:
比较功能必须使用传递返回结果对象 属性是匹配器的布尔结果。通行证 属性告诉期望匹配器是否成功 (true)或不成功(false)。
您应该返回一个声明了此类属性的对象。
试试这个:
var matcher: {
toContainTimes: function () {
return {
compare: function(actualValue, expectedResult){
var expected = expectedResult[0];
var num = expectedResult[1];
var result = {
pass: true,
message: ''
}
result.pass = actualValue.match(new RegExp(expected, "g") || []).length === num;
if(!result.pass)
result.message = 'insert error message here. this will shown when the jasmine spec failed';
return result;
}
}
}
}
用法:expect(queryString).toContainTimes(["&", 2]);