JavaScript RegEx获取测试规范

时间:2015-11-30 20:19:30

标签: javascript regex

我需要在使用Jasmine时获得我的插入符号所在的当前测试规范。所以,如果我有一个规范:

it("should do something", function() {
    var foo = 'bar';

    expect(foo).toEqual('bar');
});

并且我在空白行中有我的插入符号并且我在UI中单击某个按钮,它应该从插入符号返回以查找规范。所以它转到var foo = 'bar';行并检测到它不匹配,所以转到下一个有it()的行,因此找到该行作为规范。因此,我可以逐行回过头来检测它是否与我需要帮助的it()一行。

我的最终案例将是检测作为第二个arg传递的function()是否有参数。如果没有,那么我需要在那里添加一个。因此,由于上面的代码片段在function()中没有参数,所以我需要添加一个参数,以便它看起来像:

it("should do something", function(done) {
    var foo = 'bar';

    expect(foo).toEqual('bar');
});

请注意done中的function()。此外,"should do something"可以是双引号或单引号,并且可以包含任何合法的JavaScript字符。

作为测试,我使用了这个RegEx:

/^\s*it\((?:"|')[\w\s]+(?:"|'), function\((?:\w+)?\) {/

它适用于我的简单测试,但感觉不完整,尤其是在"should do something"检测部分。

1 个答案:

答案 0 :(得分:1)

我认为您可以安全地使用基于unroll-the-loop method

的正则表达式
^\s*it\([^,]*(?:,(?!\s*function\()[^,]*)*,\s*function\(\w*\)\s*{

它匹配字符串开头的it(,后跟任何不是, function(然后, function(...) {的内容。 ^\s*it\([\s\S]*?,\s*function\(\w*\)\s*{的同义词,但效率更高。

请参阅regex demo

现在,如果您需要在function()内没有任何文字的情况下匹配此类签名,您可以在要保留的子模式周围使用捕获组,以后可以引用$1和{{1 }}:

$2

如果你真的可以拥有Oriol建议的那些奇怪的字符串,请使用

var re = /^(\s*it\([^,]*(?:,(?!\s*function\()[^,]*)*,\s*function\()(\)\s*{)/; 
var str = 'it("should do something", function() {\n    var foo = \'bar\';\n\n    expect(foo).toEqual(\'bar\');\n});';
var subst = '$1done$2'; 
var result = str.replace(re, subst);
document.write(result);

请参阅another regex demo

匹配

^\s*it\((?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'),\s*function\(\w*\)\s*{