2013-10-10 83 views
0

我正在嘗試使用intern測試簡單節點模塊。該模塊是AMD模塊。我遇到了幾個問題使用實習生測試節點模塊Js-無法解析'require'

  1. 如果模塊定義如下,我得到的錯誤「MODULENAME」有 沒有方法「地圖」「

    define('moduleName',[]function(require){ var r= require('request'); })

  2. 如果模塊定義如下沒有moduleName,我看到這個 錯誤「undefined不是函數」 - 我猜它不能解決'require'

    define([]function(require){ var r= require('request'); })

這裏是我的測試看起來如何

define([ 
'intern!object', 
'intern/chai!assert', 
'/src/api/nameApi' 
], function (registerSuite, assert,nameApi) { 
    registerSuite({ 
    name: 'GetName Test', 
    getName: function() { 
     var nameFromApi = nameApi.getName(); 
     assert(nameFromApi!= null,'name is not null'); 
    } 
}); 

});

回答

0

提供一個明確的模塊ID作爲define的第一個參數破壞了模塊的可移植性,不應該這樣做。它目前不被master分支使用的加載器支持,因爲它是一個壞主意。它是由geezer分支支持的,但我強烈建議你不要使用這種模式。

您提供的第二個模塊定義是錯誤的;如果您希望加載特殊的require函數,則需要將'require'放在依賴項數組中。如果您希望將它作爲依賴項預加載,則也不能使用變量將模塊ID傳遞到require函數。因此,它應該是這樣的:

define(['require', 'foo'], function (require) { 
    var foo = require('foo'); 
}); 

,或者使用CommonJS的兼容性包裝語法,其中隱含提供require

define(function (require) { 
    var r = require('foo'); 
}); 

編輯:另外,現在你已經添加的測試模塊:在您的測試define中,'/ src/api/nameApi'不是有效的AMD module identifier

+0

謝謝你的回答。這是一個錯誤的請求,現在改變了這個問題。我在依賴關係中用'['require']'嘗試過,但它無法加載'request'模塊。我是否必須在'loader'的'test/intern.js'中指定'request'模塊。如果是的話如何加載node_modules中的所有模塊? '嘗試在contextRequire(/Users/userId/Documents/gitRepos/MyProject/node_modules/intern/node_modules/dojo/dojo.js:255:12)處請求卸載的模塊請求 ' – kiran

+0

答案完全相同。您的定義調用是錯誤的,遺漏了您要加載的依賴關係。請閱讀http://dojotoolkit.org/documentation/tutorials/1.9/modules/和/或http://requirejs.org/docs/api.html#defdep以瞭解AMD依賴關係如何工作。 –

+0

這裏是我的模塊定義的外觀,不要認爲這沒有什麼錯。 'define(function(require)var foo = require('request'); });' 如果這個定義是正確的,我如何確保'request'和其他npm_modules被加載。應用程序能夠加載'請求'模塊,但不能加載測試。那麼,如何確保測試加載應用程序加載的所有模塊 – kiran