2016-10-19 6 views
0

Mein D.O.H Framework wird von nodejs ausgeführt. (Version ist 1.10)XMLHTTP nicht verfügbar in D.O.H

Ich weiß, dass nodejs xmlhttprequest oder ein anderes Modul verwenden sollte, um XHR-Anfrage abzuschließen. In meinem Fall benutze ich nicht nodejs XHR direkt, sondern benutze stattdessen dojos xhr. Anscheinend kann dojo's xhr nicht von nodejs ausgeführt werden. Weil Nodejs XHR nicht ohne npm-Modul ausführen können.

Ist das eine Möglichkeit, dieses Problem zu lösen?

Befehl:

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

Ergebnis:

Error: XMLHTTP not available 

Antwort

0

ist hier Endlösung: Stummel xhr vor Last Ajax

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 */ 
    }] 
); 
}