如何在单元测试中模拟 RequireJs 加载程序插件响应
How can I mock RequireJs loader plugin responses in unit tests
我要测试的代码依赖于 RequireJs loader plugins. Example with requirejs/text:
require(['text!templates/foo'], function (data) {
// handle loaded data
});
对于特定的单元测试,我正在尝试模拟 text!templates/foo
的响应并覆盖与测试相关的响应:
it('should load a template', function (done) {
// TODO: mock 'text!templates/foo' here to return 'mock_data'
// templateViewer uses the text plugin internally to do the actual loading
templateViewer.templateFor('foo', function (error, templateData) {
expect(templateData).toEqual('mock_data');
done();
});
});
我查看了 RequireJs 依赖模拟 solutions, especially Squire.js,但它们似乎都适合模拟常规依赖而不是插件响应。
我也查看了像 sinon 这样的存根库,可能会替换实际的 require
调用,但这似乎有问题。
推荐的做法是什么?我不想在我的 requirejs 配置中用模拟插件替换整个 text
插件,只是在特定测试中覆盖它的一些响应。
我的设置是node+mocha+requirejs
编辑
请参阅此示例 fiddle 项目以查看我与 Squire 的问题:
http://runnable.com/VUBoI0ex6v9Gs-BJ/squirejs-with-plugins-for-node-js-and-hello-world
这将模拟你从要求 text!foo/x.html
中得到的东西。插件并不特殊,你只需要模拟整个路径,包括插件名称。
var requirejs = require("requirejs");
var assert = require("assert");
requirejs.config({
baseUrl: __dirname,
packages: [
{
name: "squire",
location: "node_modules/squirejs",
main: "src/Squire"
}
]
});
var x;
before(function (done) {
requirejs(["squire"], function (Squire) {
var injector = new Squire();
injector.mock("text!foo/x.html", "foo").require(["text!foo/x.html"],
function (_x) {
x = _x;
done();
});
});
});
it("foo", function () {
assert.equal(x, "foo");
});
您 运行 在您添加到问题中的示例代码中遇到的问题是您使用全局 require
而不是使用加载程序传递的 require
。您应该添加 require
作为依赖项:
define(['require', ....], function (require, ....) {
require
模块比较特殊,由RequireJS保留。它 returns 对 require
函数的引用。您必须使用它,例如,当您使用 RequireJS 的上下文时,以便在特定上下文中加载的模块使用绑定到该上下文的 require
函数。 SquireJS 还需要您执行此操作,以便它可以捕获您对 require
的调用。全局require
绕过SquireJS.
我要测试的代码依赖于 RequireJs loader plugins. Example with requirejs/text:
require(['text!templates/foo'], function (data) {
// handle loaded data
});
对于特定的单元测试,我正在尝试模拟 text!templates/foo
的响应并覆盖与测试相关的响应:
it('should load a template', function (done) {
// TODO: mock 'text!templates/foo' here to return 'mock_data'
// templateViewer uses the text plugin internally to do the actual loading
templateViewer.templateFor('foo', function (error, templateData) {
expect(templateData).toEqual('mock_data');
done();
});
});
我查看了 RequireJs 依赖模拟 solutions, especially Squire.js,但它们似乎都适合模拟常规依赖而不是插件响应。
我也查看了像 sinon 这样的存根库,可能会替换实际的 require
调用,但这似乎有问题。
推荐的做法是什么?我不想在我的 requirejs 配置中用模拟插件替换整个 text
插件,只是在特定测试中覆盖它的一些响应。
我的设置是node+mocha+requirejs
编辑
请参阅此示例 fiddle 项目以查看我与 Squire 的问题:
http://runnable.com/VUBoI0ex6v9Gs-BJ/squirejs-with-plugins-for-node-js-and-hello-world
这将模拟你从要求 text!foo/x.html
中得到的东西。插件并不特殊,你只需要模拟整个路径,包括插件名称。
var requirejs = require("requirejs");
var assert = require("assert");
requirejs.config({
baseUrl: __dirname,
packages: [
{
name: "squire",
location: "node_modules/squirejs",
main: "src/Squire"
}
]
});
var x;
before(function (done) {
requirejs(["squire"], function (Squire) {
var injector = new Squire();
injector.mock("text!foo/x.html", "foo").require(["text!foo/x.html"],
function (_x) {
x = _x;
done();
});
});
});
it("foo", function () {
assert.equal(x, "foo");
});
您 运行 在您添加到问题中的示例代码中遇到的问题是您使用全局 require
而不是使用加载程序传递的 require
。您应该添加 require
作为依赖项:
define(['require', ....], function (require, ....) {
require
模块比较特殊,由RequireJS保留。它 returns 对 require
函数的引用。您必须使用它,例如,当您使用 RequireJS 的上下文时,以便在特定上下文中加载的模块使用绑定到该上下文的 require
函数。 SquireJS 还需要您执行此操作,以便它可以捕获您对 require
的调用。全局require
绕过SquireJS.