Jasmine 的测试失败了

我想测试 Typescript 项目中没有主体的函数。我创建了一个实用的 JS 函数,它运行得很好。给出如下:


function isEmpty(f) {

    // Get content between first { and last }

    const m = f.toString().match(/\{([\s\S]*)\}/m);

    // Strip comments

    const l = m && m[1].replace(/^\s*\/\/.*$/mg, '').trim();

    if (l.length === 0) {

        return true;

    } else {

        return false;

    }

};


function doSeatMouseClick(_event, _seat) { 

 //do nothing, read only

}


var bool = isEmpty(doSeatMouseClick);

console.log(bool)

在 Spec 文件中,当我访问这个isEmpty函数时。测试失败,在控制台记录该函数时,我看到一些额外的代码,我猜 webpack 预处理器正在添加这些代码。


describe('doSeatMouseClick()', () => {

        it('should be empty', () => {

            console.log(selectionTool.doSeatMouseClick.toString());

            const bool = isEmpty(selectionTool.doSeatMouseClick);


            expect(bool).toBeTruthy();

        });

    });

测试失败截图:

http://img.mukewang.com/64b8e71900011ac620420533.jpg

慕尼黑的夜晚无繁华
浏览 127回答 1
1回答

慕神8447489

看起来函数不为空的原因是您的覆盖率跟踪器,因此cov_10clr7afd6.f[9]++. 这是检查任何已完成编译步骤的代码的问题之一,它可能不是您合理期望的。这里有一些选项:考虑正则表达式替换中的插入function isEmpty(f) {  // Get content between first { and last }  const m = f.toString().match(/\{([\s\S]*)\}/m);  // Strip comments  const l = m && m[1]    .replace(/^\s*\/\/.*$/mg, '')    .replace(/cov_\w*\.f\[[0-9]+\]\+\+;?/g, '')    .trim();  if (l.length === 0) {      return true;  } else {      return false;  }};function doSeatMouseClick(_event, _seat) { //do nothing, read onlycov_10clr7afd6.f[9]++;cov_10clr7afd6.f[500]++}var bool = isEmpty(doSeatMouseClick);console.log(bool)此解决方案也是如此,因为 codecov 工具中的任何更改都可能会破坏此问题。使用 ESLint 代替但故意忽略带注释的函数。reportIfEmpty您可以采用这种行为,也可以通过简化源代码中的函数来基于它编写自己的行为。// https://github.com/eslint/eslint/blob/master/lib/rules/no-empty-function.jsfunction reportIfEmpty(node) {    const kind = getKind(node);    const name = astUtils.getFunctionNameWithKind(node);    if (allowed.indexOf(kind) === -1 &&        node.body.type === "BlockStatement" &&        node.body.body.length === 0    ) {        context.report({            node,            loc: node.body.loc,            messageId: "unexpected",            data: { name }        });    }}您可以使用以下“在 2 分钟内创建自定义 ESLint 规则”将此新规则添加到您的 eslint 配置中。这应该是一个更强大的解决方案,但可能会突出显示您不想处理的其他错误。您可以使用eslint 覆盖来帮助将规则定位到您想要的文件。// .eslintrc{    "overrides": [        {            "files": ["some/path/*.ts"],            "rules": {              "my-project/no-empty-functions": "error"            }        }    ]}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript