我需要获取使用 Jasmine 时我的插入符所在的当前测试规范。因此,如果我有这样的规范:
it("should do something", function() {
var foo = 'bar';
expect(foo).toEqual('bar');
});
我的插入符号位于空行中,然后单击用户界面中的某个按钮,它应该从插入符号返回以找到规范。因此,它转到 var foo = 'bar';
行并检测到它不匹配,因此转到下一个具有 it()
的行,因此发现该行是规范。因此,我可以逐行返回,但检测它是否是包含 it()
的行是我需要帮助的。
我的最终情况将检测作为第二个参数传递的 function()
中是否有参数。如果没有,那么我需要在其中添加一个。因此,由于上面的代码片段在 function()
中没有参数,所以我需要添加一个参数,使其看起来像:
it("should do something", function(done) {
var foo = 'bar';
expect(foo).toEqual('bar');
});
注意现在 function()
中的done
。此外,“应该做某事”
可以是双引号或单引号,并且可以包含任何合法的 JavaScript 字符。
作为测试,我使用了这个正则表达式:
/^\s*it\((?:"|')[\w\s]+(?:"|'), function\((?:\w+)?\) {/
它适用于我的简单测试,但感觉不完整,尤其是在“应该做某事”
检测部分。
最佳答案
我认为您可以安全地使用基于 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
和 $2
:
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);
如果你真的可以像 Oriol 建议的那样拥有如此奇怪的字符串,请使用
^\s*it\((?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'),\s*function\(\w*\)\s*{
它会匹配
it(",function(){", function() {
it(',function(){', function() {
关于JavaScript RegEx 用于获取测试规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007256/