ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript-为什么此QUnit RegExp测试失败?

2019-12-08 14:37:31  阅读:267  来源: 互联网

标签:qunit unit-testing javascript regex


我在弄乱QUnit,偶然发现了一件事.

我在Chrome上尝试了以下简单测试:

deepEqual(new RegExp(), /(?:)/);

我假设它将通过,因为新的RegExp()在开发人员控制台中返回/(?:)/.对于RegExps,似乎不可能“仅仅”做新的RegExp()=== /(?:)/,但是两者的toString()函数都返回相同且相等的值.

我认为文字/非文字表示法会有所作为,但是由于此测试通过,所以情况并非如此:

deepEqual(new RegExp(" "), / /);

因此,从以下测试中,第一个失败:

test("test", function() {
    deepEqual(new RegExp(), /(?:)/); // fail
    deepEqual(new RegExp(" "), / /); // pass
    equal(new RegExp().toString(), /(?:)/.toString()); // pass
});

因此,有人能为我指出正确的方向,为什么第一次测试失败了吗?

解决方法:

简短的答案:正则表达式/(?:)/和从新RegExp()获得的对象的source属性值是不同的.对于文字,它是/(?:)/,而对于对象,则是一个空字符串.当您使用//和新的RegExp(“”)时,source属性的值是相同的(都是具有一个空格字符的字符串).

长答案:如果您查看Qunit的源代码,您将看到以下代码:

"regexp": function (b, a) {
    return QUnit.objectType(b) === "regexp" &&
        a.source === b.source && // the regex itself
        a.global === b.global && // and its modifers (gmi) ...
        a.ignoreCase === b.ignoreCase &&
        a.multiline === b.multiline;
};

您可以使用以下代码查看source参数有何不同(它仅输出每个regex参数的属性并测试它们的相等性):

function eq(x, y) {
   console.log("x.source:", "'" + x.source + "'", "y.source:", "'" + y.source + "'", "===:", x.source === y.source);
   console.log("x.global:", x.global, "y.global:", y.global, "===:", x.global === y.global);
   console.log("x.ignoreCase:", x.ignoreCase, "y.ignoreCase:", y.ignoreCase, "===:", x.ignoreCase === y.ignoreCase);
   console.log("x.multiline:", x.multiline, "y.multiline:", y.multiline, "===:", x.multiline === y.multiline);
}

当使用eq(/(??)/,new RegExp());调用此函数时,将得到:

x.source: '(?:)' y.source: '' ===: false
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true

而当您使用eq(/ /,new RegExp(“”))调用它时;你得到:

x.source: ' ' y.source: ' ' ===: true
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true

标签:qunit,unit-testing,javascript,regex
来源: https://codeday.me/bug/20191208/2091955.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有