1

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);
                })
            );
        }
    });
});

ありがとう、ドム

4

1 に答える 1

2

Node.js の依存関係をモックするために、Node.js モジュールをモックするために利用可能なさまざまなプロジェクトの 1 つを単純に使用することをお勧めします。Mockeryはスタンドアロンであるため、適切な選択です。

Internのものではなく、使用しているように見えるのでdojo/node、あなたの場合、次のようにします:

define([
  'intern!object', 'dojo/node!mockery', 'dojo/Deferred', 'require'
], function (registerSuite, mockery, Deferred, require) {
  var moduleUsingMock;
  registerSuite({
    setup: function () {
      var dfd = new Deferred();
      mockery.enable();
      mockery.registerMock('module-to-mock', mockObject);

      require([ 'module-using-mock' ], function (value) {
        moduleUsingMock = value;
        dfd.resolve();
      });

      return dfd.promise;
    },
    teardown: function () {
      mockery.disable();
    },
    'some test': function () {
      moduleUsingMock.whatever();
      // ...
    }
  });
});
于 2014-03-22T01:49:48.207 に答える