2013-11-27 39 views
1

我有一個node.js庫,我已經爲BDD設置了mochachai。我還添加了代碼覆蓋範圍istanbul。一切都通過grunt任務運行。更好的方式來動態更改測試代碼覆蓋率的require語句?

我掙扎了一會兒,終於在基於我的設置在此存儲庫上的基礎上工作後,我終於找到了它:https://github.com/morkai/h5.buffers。它的工作原理,但我不喜歡的實施。

grunt-istanbul插件處理文件,設置環境變量,並且測試使用環境變量來查找儀表測試的位置。這是我不喜歡的最後一部分。

//Gruntfile.js 
// ... 
env: { 
    "default": { 
    LIB_FOR_TESTS_DIR: srcLibForTestsDir 
    }, 
    coverage: { 
    LIB_FOR_TESTS_DIR: lcovLibForTestsDir 
    } 
} 
// ... 

然後在測試文件,代碼:

var FooClient = require((process.env.LIB_FOR_TESTS_DIR || '../lib') + '/foo-client.js'); 

我還使用在測試中運行測試文件之前所需的所有初始化一個幫手。所以我有兩個想法;

  1. 使用測試助手在文件拉動和隱藏的細節有:

    var foo = require('./test-helper.js').foo; 
    var FooClient = foo.FooClient; 
    var ThatOtherThing = foo.ThatOtherThing; 
    
  2. 使用測試運行?我已經看到了這個參考,但是我沒有找到關於它和最佳實踐的很多信息。

有沒有更好的方法?

P.S.如果有人對這個問題有一個更好的標題建議,我願意接受。

P.P.S.請不要告訴我在你的答案中切換到毛毯。我對兩者進行了評估並決定使用istanbul,因爲它提供了更多的代碼覆蓋見解(例如分支)。如果毯子的伊斯坦布爾分支已經完成,那麼我會考慮切換。

回答

1

我基本上做了你上面的事情,但將它抽象爲一個單獨的函數,以便我的測試中的要求可以更清晰/更具可讀性。

module.exports = function(path){ 
    return require((process.env.LIB_FOR_TESTS_DIR || '../lib/') + path) 
} 

,因爲這意味着你需要要求您的測試一個額外的文件,但它一直工作不夠好,對我來說這是不理想的。我的用法結束了看起來有點像這樣:

var appRequire = require('./require_helper'), 
    model  = appRequire('models/model') 

我會好奇,看看別人有什麼想法。

+0

我喜歡這個解決方案。我將等待一下,看看是否有其他答案。 –

相關問題