2013-02-03 31 views
4

我有一個使用CommonJS模塊風格的鈦項目。但是,代碼使用絕對路徑,以便在構建絕對路徑時將其沙箱化爲應用程序目錄。你如何強制節點模塊的絕對路徑?

var foo = require("/lib/module"); 

我想在命令行上運行一些測試並使jasmine-node工作。但是,當一個測試執行一個模塊時,模塊在它們的require語句中將具有上述絕對路徑。

有沒有辦法隔離(也許是chroot)節點來解析絕對需要路徑到特定的目錄?如果是這樣如何?

-- RepositoryRoot/ 
    |- app/ 
    | \- Resources/ 
    |  |- app.js # Has require("/lib/module1.js") 
    |  \- lib/ 
    |  |- module1.js # Has require("/lib/module2.js") 
    |  \- module2.js 
    \- tests/ 
     \- module1.spec.js # Has require("../app/Resources/lib/module1") 
         # Or require("/lib/module1") 
+0

你可以寫你自己的需要的功能,或者只是_not_那樣做。 –

+0

到目前爲止,我試圖使用[proxyquire](https://github.com/thlorenz/proxyquire)除了被測試的模塊開發了循環依賴關係之外,哪些工作。我真的很想避免更改代碼,希望能夠悄悄地在其上運行測試。不幸的是,到目前爲止唯一能找到的解決方案是運行每個源文件並刪除前導斜槓,然後將NODE_PATH設置爲Resources目錄。 [本博文](http://titaniumninja.com/testing-titanium-mobile-applications-with-jasmine-and-sinon-part-i/)提供了一些見解。 – Sukima

+0

這是你繼承的第三方代碼嗎?爲什麼這樣編碼? –

回答

3

這裏找到解決辦法後,我學到了什麼:簡短的回答確切上面的問題是你不能做到這一點。節點讀取絕對路徑作爲絕對路徑。所以簡而言之,答案是將我的路徑從絕對路徑改爲僞絕對路徑(相對路徑)。下面是this blog post報價是帶來了曙光:

CommonJS的require()的鈦實現buggy和 不能正確支持相對路徑。當試圖將茉莉節點測試運行程序集成到項目 中時,這與代碼中的主要 問題相關,即使是最低限度複雜的目錄樹。

一個可能的解決方案的問題是在 require()在鈦不使用相對路徑(但你可以自由在你茉莉 規格通過節點運行使用它們)。我們需要使用完整的 路徑和Resources作爲根目錄,而不是相對路徑。

這是通過在運行任何節點命令之前設置NODE_PATH環境變量來完成的。這樣,節點鈦就可以解決諸如「require(」module/path「)之類的路徑。

有幾點注意事項。某些模塊強制需要絕對路徑。在這種情況下,只要沒有任何循環依賴關係,就需要proxyquire來剔除絕對路徑。此外,由於節點沒有Titanium API,因此您還必須包含mockti包來模擬Titanium API。在spec_helper.js使用此:

global.Ti = require("mockti"); 

proxyquire = require("proxyquire"); 
var myModule = proxyquire("relative/path/to/MyModule", { 
    "/absolute/path/to/some/module": require("absolute/path/to/some/module") 
});