2014-08-29 140 views
2

我正在嘗試使用grunt-mocha-test對我的nodejs-project進行測試,並且遇到了不同/不正確路徑的問題。grunt + mochaTest:更改工作目錄?

就像我在別處看到的,我想通過只需要我的server.js來獲得所有的依賴關係。

gruntfile.js

mochaTest: { 
    test: { 
    options: { 
     reporter: 'spec', 
     require: 'app/server.js' 
    }, 
    src: ['app/test/**/*.js'] 
    } 
} 

我目前的項目結構看起來像這樣

gruntfile.js 
app/server.js 
app/models/.. 
app/controllers/.. 
app/tests/.. 

users.controller.test.js

var userCtl = require('../controllers/users.controller'); 

describe("return5", function() { 
    it("should return 5", function() { 
    var result = userCtl.return5(null, null); 
    expect(result).toBe(5); 
    }); 
}); 

users.controller.js

var mongoose = require('mongoose'); 
var User = mongoose.model('User'); // <- Mocha crash: Schema hasn't been registered for model "User". 
.. 

在我server.js我使用:

.. 
// config.js: https://github.com/meanjs/mean/blob/master/config/config.js 
config.getGlobbedFiles('./models/**/*.js').forEach(function (path) { 
    require(path); // never called with mochaTest 
}); 
.. 
console.log(process.cwd()); // "C:\path\project" (missing /app) 
.. 

所以CWD是它應該是什麼樣的不同。

有人可以幫我解決這個問題嗎?

只要我知道自己做錯了什麼,我會立即澄清標題。

謝謝。

回答

3

混淆是由於模塊路徑和文件系統路徑之間的差異。

當你做require("./blah")時,.被解釋爲意思是「從當前模塊的路徑開始」。由於這與您當前所在的模塊有關,因此取決於模塊的位置,它將解析爲不同的值。

當您運行process.cwd()時,這將返回進程的當前工作目錄。這不是而是從模塊到模塊的變化。當您的代碼調用process.chdir()時,它會發生變化。另外,當您執行使用.的文件系統操作時,這將相對於process.cwd()進行解釋。

因此,您從process.cwd()得到C:\path\project並不奇怪,因爲這是您通常運行Grunt(即在您的項目的頂層)的地方。如果您希望相對於模塊的路徑使用__dirname,則可以執行的操作。例如,此代碼從foo子目錄中讀取包含此代碼的模塊所在的相同位置中的文件:

var path = require("path"); 
var fs = require("fs"); 

var subdir = path.join(__dirname, "foo"); 
var foofiles = fs.readdirSync(subdir);