2016-11-17 29 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'; 
    }); 
});