【发布时间】:2015-04-04 18:15:37
【问题描述】:
为了追求 100% 的代码覆盖率,我正在尝试使用 mocha 来测试我的 javascript 模块在 AMD、CommonJS/Node 下是否正确加载,和 browser 条件。我使用的模式如下:
my-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”条件是唯一经过测试的条件。
到目前为止我尝试过的是这样的:
my-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,以便我也可以测试浏览器的状况?
【问题讨论】:
标签: javascript node.js unit-testing mocha.js