2016-03-15 53 views
8

我想弄清楚如何限制我的測試,以便覆蓋記者只考慮測試時覆蓋的函數爲該功能編寫,具體爲如何使用Karma,Jasmine和Istanbul來指定測試應涵蓋哪些函數/方法

PHPUnit doc下面的例子顯示相當不錯的我儘量做到:

註解@covers可以在測試代碼被用於指定 方法(S)的測試方法要測試:

/** 
* @covers BankAccount::getBalance 
*/ 
public function testBalanceIsInitiallyZero() 
{ 
    $this->assertEquals(0, $this->ba->getBalance()); 
} 

如果上述測試將被執行,僅功能getBalance將被標記爲覆蓋,並且沒有其它。

現在來自我的JavaScript測試的一些實際代碼示例。該測試顯示了不受歡迎的行爲,我試圖擺脫的:

it('Test get date range', function() 
{ 
    expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7); 
}); 

此測試將標記功能getDateRange作爲覆蓋,而且還從內部getDateRange叫任何其他功能。由於這個怪癖,我的項目的實際代碼覆蓋率可能比報告的代碼覆蓋率低很多。

我該如何阻止這種行爲?有沒有辦法讓Karma/Jasmine/Istanbul像我想要的那樣工作,還是我需要切換到另一個JavaScript測試框架?

+0

想到的是使用依賴注入和模擬來減少實際生產代碼的調用次數。 – henrikmerlander

+0

我同意henrikmerlander。此外,如果您正在使用真正的函數調用而不是間接在測試方法內部進行模擬,那麼您也正在測試該函數 – ejosafat

回答

2

我沒有看到你要問什麼特別的原因。我會說,如果你的測試導致一個嵌套函數被調用,那麼函數也被覆蓋。你確實間接測試了這段代碼,那麼爲什麼不應該包含在代碼覆蓋率指標中呢?如果內部函數包含一個bug,即使它不是直接測試,你的測試也可以捕獲它。

您可以標註有特殊的評論你的代碼告訴伊斯坦布爾忽略某些路徑: https://github.com/gotwarlost/istanbul/blob/master/ignoring-code-for-coverage.md 但是這更多的相反,我認爲,不,如果你知道你不希望特定的執行路徑是減少覆蓋覆蓋,也許是因爲編寫測試用例太難了。

另外,如果你關心隔離測試你的「低層次」的功能,然後確保你的代碼是模塊化的方式構造,使得你可以自己先測試這些。您也可以設置不同的測試運行配置,這樣您就可以擁有一套僅測試基本邏輯並報告覆蓋範圍的套件。

正如評論所說,嘲諷和依賴注入有助於使你的測試更加集中,但基本上你總是希望有一些,你檢查這些部件整合在一起,高水平的測試。如果你嘲笑一切,那麼你永遠不會測試一起工作的實際作品。

相關問題