用 chai 消除非未使用表达式错误的好方法

在我的 Chai 测试中,我经常发现自己想使用他们的断言,比如 .to.be.empty.to.be.true等等,因为我发现它们比 .to.be.length(1).to.be.equal(true)更容易阅读。但是,这破坏了我的衬里(我使用默认的 Airbnb 衬里)。

我可以使用 // disable-eslint-line语法,但是之后我必须将它添加到每一行读起来都像这样,这看起来很乏味。

我也读过关于 脏仔库的文章,但是这需要我重新检查我的整个测试库,给它们添加括号,这似乎是我不应该仅仅为了让我的 linter 传递一些首先应该可以接受的内容而做的事情。

有人知道比我上面提到的更好的处理方法吗?

43737 次浏览

您可以使用相关文件顶部的 eslint-disable禁用整个文件的规则:

/* eslint-disable no-unused-expressions */
expect(someTrueValue).to.be.true;

但是,在每个测试文件的顶部添加这个代码可能会很乏味。若要对所有相关文件禁用此规则,可以:

  1. 将新的 .eslintc 配置文件放在与测试文件相同的目录中,配置为禁用该规则。这允许您对所有其他规则使用默认配置,同时只忽略该文件夹中的文件。ESLint 称之为 Configuration Cascading

    {
    "rules": {
    "no-unused-expressions": "off"
    }
    }
    
  2. Use the overrides key in your main .eslintrc file to disable rules for groups of files with glob pattern matching:

    {
    "overrides": [
    {
    "files": ["*.test.js", "*.spec.js"],
    "rules": {
    "no-unused-expressions": "off"
    }
    }
    ]
    }
    

This also allows you to disable other rules which become troublesome in testing, such as no-underscore-dangle when using rewire.

我已经做了一个小的 插件称为 eslint-plugin-chai-friendly,它覆盖了默认的 no-unused-expressions规则,并使其友好的 chai。修改后的规则忽略 expectshould语句,同时保留其他所有语句的默认行为。

刚刚发现使用 相对全局模式的另一个选项:

在你的 .eslintrc文件中:

overrides: [
{
files: "*.test.js",
rules: {
"no-unused-expressions": "off"
}
}
]

如果今天有人碰到这个问题,我也有同样的问题,并且在 Eslint 文档上找到了这个解决方案。在您的 eslint 配置文件中,您可以指定一个或多个环境,这些环境将预定义此环境的全局变量。对我们来说,它是 mocha,你可以在你的 .eslintrc.json中这样配置:

{
"env": {
"mocha": true
},
...
...
...
}

因此,它将消除所有的假阳性摩卡 describeitbeforeEach等,而不需要完全禁用埃林特或完全禁用任何特定的规则。

使用 ESLint v. 4.11和 mocha 5.0进行测试

结合 Jonalvarezz 的回答Ihor Diachenko 的回答,我得到了我想要的:

npm install --save-dev eslint-plugin-chai-friendly

// .eslintrc.js
module.exports = {
// ...
plugins: ['chai-friendly'],
overrides: [{
files: '*.test.js',
rules: {
'no-unused-expressions': 'off',
'chai-friendly/no-unused-expressions': 'error',
},
}],
// ...
}

这样,no-unused-expression规则将只在 *.test.js文件中被重写 还有 no-unused-expression规则仍然适用于捕获测试文件中与 chai无关的任何未使用的表达式。

我用 tslint 解决了这个问题,只需将未使用表达式的规则向下移动一级。我的 ./tslint.json有所有其他我关心的规则,然后我做了 ./src/tslint.json,只是看起来像

{
"rules": {
"no-unused-expression": true
},
"extends": "../tslint.json"
}

Tslint 在每个层次上自动检查一个配置文件(使用 --project或 VSCode 扩展名) ,这意味着我的测试(在 ./test/下)应用了所有其他规则,但是 no-unused-expression只应用于 ./src/下的文件。