我需要在使用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"
检测部分。
答案 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);
匹配
^\s*it\((?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'),\s*function\(\w*\)\s*{