gpt4 book ai didi

javascript - 如何使用 squire 模拟内联 requirejs 依赖项以进行单元测试?

转载 作者:行者123 更新时间:2023-11-29 18:12:17 24 4
gpt4 key购买 nike

我正在使用带有内联需求的 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 必须以某种方式绑定(bind)到 squire 对象,我使用下划线来做到这一点)除了 spy 将由于时间原因仍然没有被调用。测试也得改成

it('should mock anotherDep', function(done) {
squire.mock('anotherDep', {
anotherFn: function() {
done();
}
});
squire.require(['someDep'], function(someDep) {
someDep.someFn();
});
});

还有更好的办法吗?如果没有,希望这能为遇到同样问题的其他人提供解决方案。

最佳答案

我没有尝试具体地做你想做的事情,但在我看来,如果 squire 做得很彻底,那么要求 require 模块应该给你你想要的,而不需要必须弄乱全局 requirerequire 模块是一个特殊的(和保留的)模块,它使本地 require 函数可用。例如,当您使用 Common JS 语法糖时,这是必需的。但是,只要您希望获得本地 require,就可以使用它。同样,如果 squire 做得很彻底,那么它给你的 require 应该是 squire 控制的,而不是某种原始的 require

所以:

define(['require', 'someDep'], function (require, someDep) {
return {
someFn: function() {
require(['anotherDep'], function(anotherDep) {
anotherDep.anotherFn();
});
}
}
});

关于javascript - 如何使用 squire 模拟内联 requirejs 依赖项以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26269119/

24 4 0