2016-03-25 27 views
1

嗨我試圖測試我開發的mithriljs模塊。然而,mithril源代碼使用global.XMLHttpRequest作爲本地請求功能。UnitTesting使用global.XMLHttpRequest的模塊

我試圖分配一個XmlHttpRequest mockglobal.XMLHttpRequest,但我的測試仍然抱怨說:

TypeError: global.XMLHttpRequest is not a function at createXhr (/path_tomodule/node_modules/mithril/mithril.js:2002:13)

Here是使用tape我的測試代碼。

.js 
;(function(){ 
    var test = require('tape'); 
    //global.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 
    global.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; 
    var m = require('mithril'); 
    var Module = require('../module.js'); 
    var config={ 
    url:'/urltoken', 
    title:'Hello there' 
    } 
    var modu=m.component(Module,{resource:config}); 
    test('constructor ',function(t){ 
    t.equal(modu.controller().url,config.url); 
    t.end(); 
    }); 
})(); 

我猜它與mithril NPM模塊不能訪問相同的餘地global做。

有關如何測試此模塊的任何建議?

回答

0

我終於找到了解決方案,感謝mithril的gitter room收到的建議,解決方案是使用m.deps(mockedWindow),如解釋here。模擬窗口可以在mithriljs源文件中的example中找到。

gist包含使用tape測試模塊所需的最終代碼。

這是module.js代碼:

'use strict'; 
var m = require('mithril'); 
var Module={}; 

Module.controller = function(args){ 
    var ctrl = this; 
    ctrl.url = args.resource.url; 
    ctrl.title = args.resource.title; 
} 

module.exports = Module; 

mytest.js測試文件:

;(function(){ 
    var mock = require('./mock.js'); 
    var m = require('mithril'); 
    var test = require('tape'); 
    var Module = require('../module.js'); 

    m.deps(mock.window); 
    var config={ 
    url:'/urltoken', 
    title:'Module title' 
    } 

    var modu=m.component(Module,{resource:config}); 
    test('constructor ',function(t){ 
    t.equal(modu.controller().url,config.url); 
    t.end(); 
    }); 
})(); 

這是嘲笑窗口的開始:

mock = (function() { 
    "use strict" 

    var window = {} 

    window.window = window 

    var document = window.document = { 
     // FIXME: add document.createRange().createContextualFragment() 
    ...