使用 flowtype 静态检查 mocha 测试代码

Posted

技术标签:

【中文标题】使用 flowtype 静态检查 mocha 测试代码【英文标题】:using flowtype to statically check mocha test code 【发布时间】:2017-04-01 16:25:20 【问题描述】:

我有一些复杂的 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 特有的,但我觉得我不能自信地从更广泛的角度来阐述这个问题,所以我的问题是:

    如何在不抑制包含describeit 的每一行的情况下让 Flow 类型检查 Mocha 测试代码? 这是更广泛的情况的一个实例吗?如果是,后者会是什么?

【问题讨论】:

【参考方案1】:

第三方库通常需要定义文件,即包含给定库的所有类型信息的文件。

此时需要mocha的定义文件,幸好flow-typed.提供

安装它

npm install -g flow-typed

然后运行

flow-typed install 

它将自动为您的依赖项安装所有可用的定义文件,包括 mocha。

【讨论】:

mocha 的流式defs 目前是一个几乎没用的自动生成存根,它们不能修复describeit 上的错误。 @Andy 您应该将导入更改为: import describe, it from 'mocha'; @paulojean 不,尽管如此,还是自己试试吧。如果你import describe from 'mocha' 然后写describe('blah', 'blah', 'blah'),你不会得到任何流错误。虽然我猜这不是什么大不了的事。 这对我不起作用。我收到Cannot reference type it [1] from a value position. 之类的错误【参考方案2】:

您可以简单地声明流describeit 变量。

/* @flow */
declare var describe: any;
declare var it: any;

describe('it', function () 
    it('fails', function() 
        const s: number = 'flow spots this error';
    );
);

【讨论】:

我认为这个解决方案没有帮助。我认为它会成功消除流类型错误,但由于使用了any,它不会对相关函数添加任何有意义的类型限制。 是的..你也可以删除流类型然后,有什么意义:D

以上是关于使用 flowtype 静态检查 mocha 测试代码的主要内容,如果未能解决你的问题,请参考以下文章

如何检查请求是不是使用 JavaScript (Mocha) 发送

使用 Mocha 进行 JavaScript 代码自动化测试

带有 mocha 的节点检查器无法使用“调试器”命令

为啥我的 mocha/chai Error throwing 测试失败了?

使用 mocha 运行节点检查器

使用mocha测试