在单元测试时,你如何知道函数中使用的是循环还是双循环



我是单元测试的新手,我想检查是否有任何一行代码专门包含双循环。

我目前正在训练营学习,他们会以某种方式检查我的解决方案是否包含特定的循环(比如while循环(,或者我是否使用了嵌套循环,如下所示。

Test Code
function () {
expect(DOUBLE_LOOP_EXP.test(funcBody)).to.be.equal(true);
} 

为了澄清,下面是我通过上述标准测试的函数;

function makePermutations(str) {
let result = '';
for (let i = 0; i < str.length; i++) {
for (let j = 0; j < str.length; j++) {
result += str[i] + str[j] + ',';
}
}
return result.slice(0, result.length - 1);
}
module.exports = makePermutations;

不幸的是,没有办法知道DOUBLE_LOOP_EXP.test里面有什么。请告知。

正则表达式可以类似于:

/fors*([^;]+;[^;]+;[^;]+)s*{?s*fors*([^;]+;[^;]+;[^;]+)/

为此使用regexp是不正确的,因为它们不知道语言语法,可能会导致误报或误报,例如匹配注释或被注释卡住。

这需要解析JavaScript语法。例如,这个库允许查询流行的Esprima解析器(一个游乐场(生成的AST:

const ast = esprima.parse(makePermutations.toString());
const selector = esquery.parse('ForStatement ForStatement');
const nestedFor = esquery.match(ast, selector);
expect(nestedFor.length).toBe(1);

考虑到这个问题适用于测试,在单元测试中从来没有必要这样做——除非你测试生成这个代码的编译器。

可能需要断言实现细节,但不能断言到这个程度。从单元测试的角度来看,是否存在for循环并不重要。如果该功能不涉及其他单元,也没有副作用,则应通过指定预期输入和输出来执行测试:

expect(makePermutations('abc')).toBe('aa,ab,ac,ba,bb,bc,ca,cb,cc');

最新更新