如何使用Mocha和Chai断言固定模式与修饰符的RegExp?
解决Mocha中断言固定正则表达式的问题
哦,这个问题我熟!你遇到的是JavaScript里正则表达式对象的一个小坑——哪怕两个正则的模式和修饰符完全一样,它们也是不同的对象实例,所以用expect(...).to.equal(...)做严格相等断言肯定会失败,这就是你看到AssertionError的原因。
下面给你两种可靠的解决方法:
方法一:检查source和flags属性(ES6+推荐)
从ES6开始,正则表达式对象有两个直接的属性可以用来验证:
source:返回正则的模式字符串(不带斜杠和修饰符)flags:返回正则的修饰符字符串(比如i、g、mi等)
修改后的测试代码如下:
var expect = require("chai").expect; describe("myRegExp() function", function () { it("returns constant pattern and modifiers", function () { const regResult = myRegExp(); // 验证模式是否正确 expect(regResult.source).to.equal("somePattern"); // 验证修饰符是否正确 expect(regResult.flags).to.equal("i"); }); }); var myRegExp = function(){ return /somePattern/i; }
方法二:检查单个修饰符属性(兼容旧环境)
如果你的运行环境不支持flags属性(比如较老版本的Node.js),可以直接检查正则对象的修饰符对应的布尔属性:
ignoreCase:对应i修饰符global:对应g修饰符multiline:对应m修饰符
测试代码可以写成这样:
var expect = require("chai").expect; describe("myRegExp() function", function () { it("returns constant pattern and modifiers", function () { const regResult = myRegExp(); expect(regResult.source).to.equal("somePattern"); // 验证是否开启了忽略大小写修饰符 expect(regResult.ignoreCase).to.be.true; // 验证其他默认修饰符未开启(如果你的正则不需要的话) expect(regResult.global).to.be.false; expect(regResult.multiline).to.be.false; }); }); var myRegExp = function(){ return /somePattern/i; }
这两种方法都能准确验证你的函数返回的正则是否符合预期的模式和修饰符,再也不会因为对象引用不同而断言失败啦!
内容的提问来源于stack exchange,提问作者dev7
相关产品推荐
相关产品推荐

