Node.js で実行され、 Dojo を使用するサーバー コードを含むアプリケーションがあります。config
次のように定義されたモジュールがあります。
define([
'dojo/node!nconf',
'dojo/_base/config'
], function (nconf, dojoConfig) {
nconf.argv().file({
file: dojoConfig.baseDir + '/config.json'
});
console.log('-- file name:', dojoConfig.baseDir + '/config.json');
console.log('-- context:', nconf.get('context'));
// ... logic here ...
return nconf.get(nconf.get('context'));
});
このモジュールを単体テストできるようにするために、2 つのモックを作成しました。1 つはnconf
ネイティブ モジュール用で、もう 1 つはdojoConfig
. テストは次のとおりです。
define([
'require',
'intern!object',
'intern/chai!assert'
], function (require, registerSuite, assert) {
registerSuite({
name: 'config utility',
'load default settings': function () {
require.undef('dojo/node!nconf');
require.undef('dojo/_base/config');
require({ map: {
'*': {
'dojo/node!nconf': 'server/utils/tests/nconfMock',
'dojo/_base/config': 'server/utils/tests/dojoConfigMock'
}
}});
require(['../config', './nconfMock'], this.async(1000).callback(
function (config, nconfMock) {
assert.isNotNull(config);
assert.isNotNull(nconf);
// assert.deepEqual(config, nconfMock.contextSettings.test);
}
));
}
});
});
dojoConfig
のモックが正しくロードされていることがわかりますが、nconf
モジュールのモックはロードされていません。Intern の Web キャストで、Dylan はマッピングがプラグインを考慮していないこと、dojo/node
モジュールに this を強制的にロードさせる方法があることを述べましnconfMock
た。詳細を教えていただけませんか?
明らかに、これは冗長であるため、これが引き続き一般的な要求である場合は、おそらく将来的に簡単にするために何かを行うでしょう.
重要な注意:にマッピングdojo/node
しないと、上で定義しintern/node_modules/dojo/node
た初期モジュールのロードがIntern 環境で失敗します。config
マッピングはintern.js
ファイルで行われます。報告されたエラーは次のとおりです。
Error: node plugin failed to load because environment is not Node.js
at d:/git/fco2/src/libs/dojo/node.js:3:9
at execModule (d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:512:54)
at d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:579:7
at guardCheckComplete (d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:563:4)
at checkComplete (d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:571:27)
at onLoadCallback (d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:653:7)
at d:\git\fco2\node_modules\intern\node_modules\dojo\dojo.js:758:5
at fs.js:266:14
at Object.oncomplete (fs.js:107:15)
解決策:以下の Colin Snover が提案したように、私は現在 Mockery を使用しています。また、 contextual は使用せrequire
ず、デフォルトのみを使用します。これは、バージョン 1.9.3 の Dojo ツールキットで動作する (簡略化された) ソリューションです。
define([
'intern!object',
'intern/chai!assert',
'intern/node_modules/dojo/node!mockery',
'./nconfMock'
], function (registerSuite, assert, mockery, nconfMock) {
registerSuite({
name: 'config utility',
teardown: function () {
mockery.disable();
mockery.deregisterAll();
require({ map: { '*': { 'dojo/_base/config': 'dojo/_base/config' } } });
require.undef('dojo/_base/config');
require.undef('server/utils/config');
},
'load default settings': function () {
mockery.enable();
mockery.registerMock('nconf', nconfMock);
require({ map: { '*': { 'dojo/_base/config': 'server/utils/tests/dojoConfigMock' } } });
require.undef('dojo/_base/config');
require.undef('server/utils/config');
require(
['server/utils/config'],
this.async(1000).callback(function (config) {
assert.isNotNull(config);
assert.deepEqual(config, nconfMock.contextSettings.test);
})
);
}
});
});
ありがとう、ドム