在追求100%的代碼覆蓋率的,我試圖用摩卡來測試我的javascript模塊AMD
下正確加載,CommonJS/Node
,並browser
條件。我使用的模式如下:如何在mocha測試中模擬全局變量(定義,模塊,窗口)?
我-module.js
(function(global){
function MyClass(){}
// AMD
if(typeof define === 'function' && define.amd){
define(function(){
return MyClass;
});
// CommonJS/Node
} else if (typeof module !== 'undefined' && module.exports){
module.exports = MyClass;
// Browser
} else {
global.MyClass = MyClass;
}
})(this);
因爲我跑我的節點測試,define
是從來沒有定義,總是被定義module
;所以「CommonJS/Node」條件是唯一經過測試的條件。
我至今嘗試過是這樣的:
我-module.test.js
var MyClass = require('./my-module');
describe('MyClass', function(){
// suite of tests for the class itself
// uses 'var instance = new MyClass();' in each test
// all of these tests pass
});
describe('Exports', function(){
// suite of tests for the export portion
beforeEach(function(){
MyClass = null; // will reload module for each test
define = null; // set 'define' to null
module = null; // set 'module' to null
});
// tests for AMD
describe('AMD', function(){
it('should have loaded as AMD module', function(){
var define = function(){};
define.amd = true;
MyClass = require('./my-module'); // might be cached?
// hoping this reloads with 'define' in its parent scope
// but it does not. AMD condition is never reached.
expect(spy).to.have.been.called(); // chai spy, code omitted
});
});
});
我使用的間諜,以檢查是否define
被調用,但模塊沒有顯示任何可用的define
重新加載的跡象。我怎樣才能做到這一點?
並有沒有一種安全的方法取消module
,以便我可以測試瀏覽器的情況?
感謝您的答案!這看起來很有希望,明天就會測試一下! – SteamDev
有用的模塊,但在這種特殊情況下沒有雪茄。我認爲這可能是因爲我需要全局可用於包裝IIFE,而不是導出的類本身。 – SteamDev