如何编写Jasmine自定义匹配器

问题描述 投票:1回答:1

我正在尝试编写一个自定义匹配器,用于测试字符串是否包含特殊数量的不同字符串。这就是我做的。

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);

如果字符串“&”在queryString中恰好出现两次,它应该返回true。我做错了什么?

javascript testing jasmine matcher
1个回答
4
投票

来自Jasmine文档:

compare函数必须返回一个带有pass属性的结果对象,该属性是匹配器的布尔结果。 pass属性告诉期望匹配器是成功(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]);

© www.soinside.com 2019 - 2024. All rights reserved.