使用flowtype静态检查mocha测试代码
using flowtype to statically check mocha test code
我有一些复杂的 Mocha 代码,我想用 FlowType 进行静态检查,为什么不呢?
下面是一个最小的复制:
/* @flow */
describe('it', function () {
it('fails', function() {
const s: number = 'flow spots this error';
});
});
当我 运行 对此进行 Flow 时,Flow 确实发现了将 string
分配给 number
的问题,这表明该方法在某种程度上是有效的。
然而,我也得到:
test/test.js:4
4: describe('it', function () {
^^^^^^^^ identifier `describe`. Could not resolve name
test/test.js:5
5: it('fails', function() {
^^ identifier `it`. Could not resolve name
… 显然 Mocha 测试定义 运行 在这些功能全局可用的环境中,但查看测试文件没有任何东西可以让 Flow 检测到。
我不确定这些问题是 Mocha 特有的,但我觉得我不能自信地从更广泛的角度来阐述这个问题,所以我的问题是:
- 如何让 Flow 类型检查 Mocha 测试代码而不抑制包含
describe
或 it
的每一行?
- 这是更广泛的 class 情况的一个实例吗?如果是,后者会是什么?
第三方库通常需要定义文件,即包含给定库的所有类型信息的文件。
在这种情况下,你需要一个mocha的定义文件,幸运的是flow-typed.
提供了
安装
npm install -g flow-typed
然后 运行
flow-typed install
它将自动为您的依赖项安装所有可用的定义文件,包括 mocha。
您可以简单地声明流 describe
、it
变量。
/* @flow */
declare var describe: any;
declare var it: any;
describe('it', function () {
it('fails', function() {
const s: number = 'flow spots this error';
});
});
我有一些复杂的 Mocha 代码,我想用 FlowType 进行静态检查,为什么不呢?
下面是一个最小的复制:
/* @flow */
describe('it', function () {
it('fails', function() {
const s: number = 'flow spots this error';
});
});
当我 运行 对此进行 Flow 时,Flow 确实发现了将 string
分配给 number
的问题,这表明该方法在某种程度上是有效的。
然而,我也得到:
test/test.js:4
4: describe('it', function () {
^^^^^^^^ identifier `describe`. Could not resolve name
test/test.js:5
5: it('fails', function() {
^^ identifier `it`. Could not resolve name
… 显然 Mocha 测试定义 运行 在这些功能全局可用的环境中,但查看测试文件没有任何东西可以让 Flow 检测到。
我不确定这些问题是 Mocha 特有的,但我觉得我不能自信地从更广泛的角度来阐述这个问题,所以我的问题是:
- 如何让 Flow 类型检查 Mocha 测试代码而不抑制包含
describe
或it
的每一行? - 这是更广泛的 class 情况的一个实例吗?如果是,后者会是什么?
第三方库通常需要定义文件,即包含给定库的所有类型信息的文件。
在这种情况下,你需要一个mocha的定义文件,幸运的是flow-typed.
提供了安装
npm install -g flow-typed
然后 运行
flow-typed install
它将自动为您的依赖项安装所有可用的定义文件,包括 mocha。
您可以简单地声明流 describe
、it
变量。
/* @flow */
declare var describe: any;
declare var it: any;
describe('it', function () {
it('fails', function() {
const s: number = 'flow spots this error';
});
});