/ / डोज / नोड के साथ लोड किए गए Node.js मॉड्यूल को कैसे मॉक करें - यूनिट-टेस्टिंग, डोजो, मॉकिंग, इंटर्न

डोज / नोड के साथ लोड किए गए Node.js मॉड्यूल को कैसे मॉक करें - यूनिट-टेस्टिंग, डोजो, मॉकिंग, इंटर्न

मेरे पास सर्वर कोड के साथ एक एप्लिकेशन है 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"));
});

इस मॉड्यूल को यूनिट टेस्ट करने में सक्षम होने के लिए, मैंने "दो मोहरे लिखे हैं: एक के लिए nconf देशी मॉड्यूल और एक के लिए 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 मॉड्यूल। इंटर्न पर एक वेबकास्ट के दौरान, डायलन ने उल्लेख किया कि मैपिंग प्लगइन पर विचार नहीं करता है, कि बल के लिए रास्ता है dojo/node इसे लोड करने के लिए मॉड्यूल nconfMock। क्या आप मुझे अधिक जानकारी देना चाहेंगे?

जाहिर है, यह क्रिया है, इसलिए यदि यह एक सामान्य अनुरोध है, तो हम शायद भविष्य में इसे सरल बनाने के लिए कुछ करेंगे।

महत्वपूर्ण लेख: बिना मैपिंग के dojo/node सेवा मेरे intern/node_modules/dojo/nodeमेरे प्रारंभिक के लोडिंग 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:gitfco2node_modulesinternnode_modulesdojodojo.js:512:54)
at d:gitfco2node_modulesinternnode_modulesdojodojo.js:579:7
at guardCheckComplete (d:gitfco2node_modulesinternnode_modulesdojodojo.js:563:4)
at checkComplete (d:gitfco2node_modulesinternnode_modulesdojodojo.js:571:27)
at onLoadCallback (d:gitfco2node_modulesinternnode_modulesdojodojo.js:653:7)
at d:gitfco2node_modulesinternnode_modulesdojodojo.js:758:5
at fs.js:266:14
at Object.oncomplete (fs.js:107:15)

उपाय: जैसा कि नीचे कॉलिन स्नोवर ने सुझाव दिया है, मैं अब मॉकरी का उपयोग करता हूं। मैं भी उपयोग नहीं करते प्रासंगिक require, केवल डिफ़ॉल्ट एक। यहाँ एक (सरलीकृत) समाधान है जो कि Dojo टूलकिट के संस्करण 1.9.3 के साथ काम कर रहा है।

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

धन्यवाद, डॉम

उत्तर:

उत्तर № 1 के लिए 1

Node.js की निर्भरता का मज़ाक उड़ाने के लिए, आप शायद Node.js मॉड्यूल के लिए विभिन्न उपलब्ध परियोजनाओं में से एक का उपयोग करना चाहेंगे। मज़ाक स्टैंड-अलोन होने के बाद से यह एक अच्छा विकल्प है।

चूंकि यह ऐसा लगता है जैसे आप उपयोग कर रहे हैं 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();
// ...
}
});
});