2016-11-17 86 views
10

我有一些复杂的摩卡代码,我想静态检查FlowType,因为为什么不呢?使用flowtype静态检查摩卡测试代码

下面是一个最小的摄制:

/* @flow */ 

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

当我在这个运行流速,流量确实与stringnumber分配这表明,该方法是工作在一定程度上发现的问题。

不过,我也得到:

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检测到这一点。

我不知道这些问题是特定于摩卡,但我不觉得我可以自信地架在更广泛的方面的问题,所以我的问题是:

  1. 我怎么能有流量式检查摩卡测试代码不会抑制包含describeit的每一行?
  2. 这是更广泛的一类情况的一个例子,如果是的话,后者会是什么?

回答

4

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

在这种情况下,你需要为摩卡的定义文件,所幸被flow-typed.

提供

npm install -g flow-typed 

安装它,然后运行

flow-typed install 

它会自动安装所有您的依赖关系的可用定义文件,包括mocha。

+1

摩卡的流类型defs目前是一个最没用的自动生成存根,他们没有修正“describe”和“it”的错误。 – Andy

+2

@你应该改变进口: import {describe,it} from'mocha'; – paulojean

+0

@paulojean不,即使如此,请自己尝试一下。如果你从'mocha''输入{describe},然后写'describe'('blah','blah','blah')',你就不会有任何流量错误。虽然这不是一个巨大的交易,我猜。 – Andy

1

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

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

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