2013-10-07 65 views
1

所以我試圖通過一個Mongoose項目的教程,TDD風格,爲每個步驟應該完成的任務編寫測試來教自己茉莉花(對於節點)然後按照實際教程等。檢查使用茉莉節點加載的節點模塊

當然,我的第一個測試是失敗的。

app.js在這一點上是兩條線:

var mongoose = require('mongoose'); 
console.log(mongoose.version); 

這運行正常。我的測試然而,仍然未能:

var app = require('../src/app.js'); 

describe('App startup', function() { 
    it('loads mongoose', function() { 
      expect(app.mongoose.version).toBeDefined(); 
    }); 
    it('loads jasmine-jquery', function() { 
      expect($).toBeDefined(); 
    }); 
}); 

結果

Failures: 

1) App startup loads mongoose 
Message: 
TypeError: Cannot read property 'version' of undefined 
Stacktrace: 
TypeError: Cannot read property 'version' of undefined 
at null.<anonymous> (/home/jbhelfrich/mongooseBlog/spec/init.spec.js:5:36) 

(jQuery的測試,當然,預計在這一點上仍然要失敗的。)我一直有和沒有嘗試過「應用程序」。在expect語句中,但我得到了同樣的錯誤 - 測試套件沒有看到app.js的內部結構。但是我知道它正確加載了app.js文件,因爲它正在運行它 - console.log輸出出現在測試結果之前。

所以我懷疑我誤解了一些關於範圍或其他菜鳥錯誤的基礎知識,但我不確定那是什麼。

回答

0

Node.js被組織成模塊。如果您希望模塊的屬性可訪問,則必須在module.exports變量中定義該模塊的屬性。這是一個出口可能是什麼樣子(注意:exports引用module.exports):

var mongoose = require('mongoose'); 
console.log(mongoose.version); 
exports.mongoose = mongoose; 

然後當你與上面顯示的代碼文件中使用require(),變量將被設置,其中app相當於module.exports在被加載的模塊中:

var app = require('../src/app.js'); 
console.log(app.mongoose.version); 
+0

工作就像一個魅力,謝謝!是否有任何理由(安全,性能)來消除出口。 來自生產代碼的行,還是可以單獨留下? – jbhelfrich

+0

沒有理由刪除導出,因爲如果您不導出變量,那麼它們無法在模塊之外訪問。 – hexacyanide