我的D.O.H框架由nodejs运行。 (版本是1.10)
我知道nodejs应该使用xmlhttprequest
或其他模块来完成XHR请求。在我的情况下,我不是goona直接使用nodejs XHR,而是使用dojo的xhr代替。显然,dojo的xhr无法由nodejs运行。因为nodejs不能在没有npm模块的情况下运行XHR。
这有可能解决这个问题吗?
命令:
node unittest.js load=doh test=test_custom_ajax.js
unittest.js:
global.dojoConfig = {
baseUrl: ".",
packages: [
{ name: "dojo", location: "./dojo" },
{ name: "dojox", location: "./dojox" },
{ name: "dijit", location: "./dijit" },
{ name: "my", location: "./my" }
]
}
require("./dojo/dojo.js");
custom_ajax.js:
define([
"dojo",
"dojo/_base/declare",
"dojo/_base/lang",
"dojo/request/xhr"
], function(dojo, declare, lang, xhr) {
return declare("my.custom_ajax", null, {
ajaxGet: function(url, options) {
options = options || {};
return xhr(url, {
method: "GET",
handleAs: "json",
headers: {
"Content-Type":"application/json",
"Accept":"application/json"
},
}).then(
lang.hitch(this, function(data) {
/* handle data */
if (options.onHandle) {options.onHandle(resp)}
if (options.onLoad) {options.onLoad(resp)}
if (options.onComplete) {options.onComplete(resp)}
}),
lang.hitch(this, function(err) {
/* handle error */
if (options.onError) {options.onError(resp)}
})
);
}
});
});
test_custom_ajax.js:
define([
"doh/runner",
"my/custom_ajax"
], function(doh, custom_ajax) {
doh.register("test_custom_ajax", [{
var ca = new custom_ajax();
var options = {};
ca.ajaxGet('some_url', options);
}]);
}
结果:
Error: XMLHTTP not available
答案 0 :(得分:0)
这是最终解决方案:加载Ajax之前的stub xhr
<强> test_custom_ajax.js 强>
define([
"doh/runner",
"dojo/node!sinon",
"dojo/request/xhr",
"dojo/Deferred"
], function(doh, sinon, xhr, Deferred) {
doh.register("test_custom_ajax",[{
/*--------------------------------------------------
stub xhr before load Ajax
--------------------------------------------------*/
// original xhr -> custom xhr
var oldXhr = require.modules["dojo/request/xhr"]["result"];
var getDeferred;
require.modules["dojo/request/xhr"]["result"] = function(url, options) {
if (options.method === 'GET') {
getDeferred = new Deferred();
return getDeferred;
}
};
var Ajax;
require(["my/custom_ajax"], function(custom_ajax) {
Ajax = custom_ajax;
// custom xhr -> original xhr
require.modules["dojo/request/xhr"]["result"] = oldXhr;
});
// prepare stub
var onHandleStub = sinon.stub();
var onLoadStub = sinon.stub();
var onCompleteStub = sinon.stub();
var onErrorStub = sinon.stub();
/*------------------------------------------------*/
// Inside this new Ajax, xhr is customized
var ca = new Ajax();
// Normal AjaxGet
ca.ajaxGet('some_url', {
onHandle: onHandleStub,
onLoad: onLoadStub,
onComplete: onCompleteStub
});
getDeferred.resolve(); //control xhr
/* assert stub */
// Error AjaxGet
ca.ajaxGet('some_url', {
onError: onErrorStub,
});
getDeferred.reject(); //control xhr
/* assert stub */
}]
);
}