2016-02-04 34 views
0

好吧,我不確定這是否可能,但在這裏, 假設我是整個世界的中央天氣監視器。 我需要能夠調用每個國家的天氣API來獲取諸如溫度,風和雨等信息。 所有的國家聚在一起,並同意有包會導出相同的功能。 所以每一個國家建立具有NPM包:NPM Package如何依賴另一個軟件包中的測試,但注入自己的測試出口?

exports.currentTemp() { return <current temperature>;} 
exports.currentWind() { return <current wind speed>;} 
exports.currentRain() { return <current rain fall>;} 

中央氣象臺監測創造了一個測試套件通話天氣-API的測試和運行一些測試。 每個國家都有責任確保代碼在推送代碼之前通過測試。 每個國家如何依賴weather-api-test軟件包並在那裏運行測試? 我想問一個簡短的方法是,我該如何動態添加一個require('uk-weather-api');進入摩卡測試?

+0

我有在這裏創建了一個壞例子:https://github.com/MikeBateman/global-weather –

回答

0

有一個名爲rewire的庫,可以讓你做你想做的事。 它基本上允許您覆蓋其他腳本中的局部變量。

https://github.com/jhnns/rewire

例如: 如果您共享的測試(可以稱之爲theirTest)需要一個這樣的腳本:

var foo = require("theirScript"); 

您可以使用自己的測試這樣的重新連接:

var rewire = require("rewire"); 
var theirTest = rewire("./theirTest"); // Note that I used rewire here and not require 
var bar = require("./myScript"); // The script you want to inject into their tests 

theirTest.__set__("foo", bar); //__set__ is a rewire injected function allowing you to access foo 

你最終得到的是你自己的新測試腳本,它將你的腳本注入到他們的測試中。在這種情況下,您正在對腳本運行測試。

+0

感謝mitch,rewire庫似乎完全適合,我創建了git repo https://github.com/MikeBateman /全球氣候,並會考慮爲其他人樹立我的榜樣。歡呼 –

0

你可以讓你的測試套件加載一個名爲./impl的模塊,那些希望運行你的套件的人對他們的實現進行創建,以便加載他們的特定實現並將其提供給你的測試套件。該套件可能是這樣的:

var assert = require("assert"); 
var impl; 

try { 
    impl = require("./impl"); 
} 
catch (e) { 
    if (e instanceof Error && e.code === "MODULE_NOT_FOUND") 
     throw new Error("You must create a module that loads as `./impl` in" + 
         "in the test suite so that the suite can load your " + 
         "implementation of the API."); 

    // Just rethrow anything else... 
    throw e; 
} 

it("works", function() { 
    assert(impl.getId() !== undefined); 
}); 

假設我有a.js實現:

exports.getId = function() { 
    return module.id; 
}; 

我可以創造一個impl.js文件中像這樣來加載我的實現:

module.exports = require("./a"); 
+0

嗨路易斯,我想對你的建議表示感謝,但我覺得米奇的解決方案使用rewire更好,因爲它更多的SOILD,不需要創建'./impl'。 –