为了账号安全,请及时绑定邮箱和手机立即绑定

Jasmine 的测试失败了

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();        });    });测试失败截图:
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

看起来函数不为空的原因是您的覆盖率跟踪器,因此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 only

cov_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.js

function 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"

            }

        }

    ]

}


查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信