我将 requirejs 与内联要求一起使用,例如:
define(['someDep'], function(someDep) {
return {
someFn: function() {
require(['anotherDep'], function(anotherDep) {
anotherDep.anotherFn();
});
}
}
});
在我的特殊情况下,我不能包含anotherDep
在定义中。
在使用 mocha 进行测试时,我有一个这样的测试用例:
define(['squire'], function(Squire) {
var squire = new Squire();
describe('testcase', function() {
it('should mock anotherDep', function(done) {
var spy = sinon.spy();
squire.mock('anotherDep', {
anotherFn: spy
});
squire.require(['someDep'], function(someDep) {
someDep.someFn();
expect(spy).to.have.been.calledOnce;
done();
});
});
});
});
失败是因为直接anotherDep
调用require
而不是squire.require
. 解决方法是require
在全局范围内替换,
var originalRequire;
before(function() {
originalRequire = require;
require = _.bind(squire.require, squire);
});
after(function() {
require = originalRequire;
});
这有效(请注意,squire.require
必须以squire
某种方式绑定到对象,我使用下划线来执行此操作),但由于时间原因仍不会调用间谍。测试也必须更改为
it('should mock anotherDep', function(done) {
squire.mock('anotherDep', {
anotherFn: function() {
done();
}
});
squire.require(['someDep'], function(someDep) {
someDep.someFn();
});
});
有没有更好的办法?如果没有,希望这能为遇到同样问题的其他人提供解决方案。