2013-09-29 43 views
1

我有一個包含幾個可選單元的Node.js軟件。每個可選單元都要求用戶下載並安裝某個第三方軟件。其他(非可選)單位在沒有第三方的情況下工作。可選單元的單元測試

現在,我爲所有單位(包括可選單位)設置了一套Mocha.js單元測試。所有測試都通過我的電腦,因爲我已經安裝了所有第三方。但是,如果一個天真的用戶下載我的軟件包並運行測試,他會因爲缺少第三方而收到難看的錯誤消息。

安排測試的最佳方式是什麼?對於每個用戶,只有相關的測試將運行?

目前,我使用的代碼與此類似:

try { 
    var thirdparty = require('thirdparty'); 
    var isTestRelevant = true; 
} catch (e) { 
    console.warn("WARNING: no thirdparty module - can't run this unitest"); 
    var isTestRelevant = false; 
} 

if (isTestRelevant) { 
    describe('the unit', function() { 
     it('does something', function() { ... } 
    }); 

    describe('the unit', function() { 
     it('does something else', function() { ... } 
    }); 
} 

是否有可選單元一個更好的,更通用的解決方案?

回答

4

理想,一會在describe使用skipit標記的測試爲掛起。請參閱"Inclusive tests"

儘管在您的示例中,使用布爾值來確定是否將測試標記爲掛起,所以這裏是一個解決方案。

如果it()沒有第二個參數(回調函數來作出斷言),Mocha似乎將該測試標記爲「掛起」(未運行測試)。見"Pending tests"


這裏是一個例子。如果我們有一個名爲conditionalTests.test.js文件:

var assert = require('assert'); 

describe("The Assert module", function() { 
    it("sees true as true", function() { 
    assert.ok(true); 
    }); 

    it("sees false as not true", function() { 
    assert.ok(!false); 
    }); 
}); 

...和摩卡叫上,兩個測試將運行(他們通過,這並不奇怪):

$ mocha --reporter spec conditionalTests.test.js 


    The Assert module 
    ✓ sees true as true 
    ✓ sees false as not true 


    2 passing (19ms) 

...但是,如果第二次測試被改變,像這樣(使用isTestRelevant變量在三元,其中null是可能的,因爲回調參數):

it("sees false as not true", isTestRelevant ? function() { 
    assert.ok(!false); 
    } : null); 

...那麼該測試將顯示彷彿isTestRelevant未決是假的:

The Assert module 
    ✓ sees true as true 
    - sees false as not true 


    1 passing (19ms) 
    1 pending 

要改變基於isTestRelevant測試名稱,以類似的方式再次使用三元運算。

創建另一個變量來保存名稱更改爲:

var skippedTestName = "A test was skipped because ..."; 

...然後改變的語法「看到假的不是真的」測試:

it(
    isTestRelevant ? 
     "sees false as not true" : skippedTestName, 
    isTestRelevant ? 
     function() { 
     assert.ok(!false); 
     } : null 
); 

現在測試輸出如下:

The Assert module 
    ✓ sees true as true 
    - A test was skipped because ... 


    1 passing (19ms) 
    1 pending 
+0

謝謝你,這是比我以前的解決方案要好得多。有什麼辦法可以讓我在報告中添加一條自定義消息,例如:「 - 將false視爲不正確**因爲您沒有安裝false.js模塊,所以此測試已被禁用**「? –

+0

@ErelSegalHalevi不客氣。這是可能的,儘管它使情況更加混亂。 :)我用一個例子更新了我的答案。 –

+0

謝謝!我認爲你的答案應該是Mocha.js的標準功能:) –