这个答案是基于
Andreas Köberle的回答的。
对于我来说,实现和理解他的解决方案并不容易,因此我将详细解释它的工作原理以及一些需要避免的陷阱,希望能帮助未来的访问者。
首先是设置:
我使用Karma作为测试运行器,MochaJs作为测试框架。
使用类似Squire的东西对我来说没有用,由于某种原因,当我使用它时,测试框架会抛出错误:
TypeError:无法读取未定义的属性“call”
RequireJs有可能将模块ID映射到其他模块ID上。它还允许创建一个
require
函数,该函数使用与全局
require
不同的
不同配置。
这些功能对于此解决方案至关重要。
以下是我编写的模拟代码版本,包括(很多)注释(希望能够理解)。我将其包装在一个模块中,以便测试可以轻松地引用它。
define([], function () {
var count = 0;
var requireJsMock= Object.create(null);
requireJsMock.createMockRequire = function (mocks) {
count++;
var map = {};
for (property in mocks) {
if (mocks.hasOwnProperty(property)) {
var moduleId = property;
var module = mocks[property];
var stubId = 'stub' + moduleId + count;
map[moduleId] = stubId;
define(stubId, function () {
return module;
});
}
}
var defaultContext = requirejs.s.contexts._.config;
var requireMockContext = { baseUrl: defaultContext.baseUrl };
requireMockContext.context = "context_" + count;
requireMockContext.map = {
"*": map
};
return require.config(requireMockContext);
};
return requireJsMock;
});
我遇到的最大陷阱,字面上花费了我数小时的时间,是创建RequireJs配置。我试图(深度)复制它,并仅覆盖必要的属性(如上下文或映射)。这行不通!只需复制
baseUrl
,这很好用。
使用方法
要使用它,请在测试中引用它,创建模拟对象,然后将其传递给createMockRequire
。例如:
var ModuleMock = function () {
this.method = function () {
methodCalled += 1;
};
};
var mocks = {
"ModuleIdOrPath": ModuleMock
}
var requireMocks = mocker.createMockRequire(mocks);
这里是一个完整测试文件的
示例:
define(["chai", "requireJsMock"], function (chai, requireJsMock) {
var expect = chai.expect;
describe("Module", function () {
describe("Method", function () {
it("should work", function () {
return new Promise(function (resolve, reject) {
var handler = { handle: function () { } };
var called = 0;
var moduleBMock = function () {
this.method = function () {
methodCalled += 1;
};
};
var mocks = {
"ModuleBIdOrPath": moduleBMock
}
var requireMocks = requireJsMock.createMockRequire(mocks);
requireMocks(["js/ModuleA"], function (moduleA) {
try {
moduleA.method();
expect(called).to.equal(1);
resolve();
} catch (e) {
reject(e);
}
});
});
});
});
});
});
define
函数。不过有几种不同的选择。我会发布一个答案,希望它能有所帮助。 - Jamison Dance