0

我试图测试的代码依赖于 RequireJs loader pluginsrequirejs/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 依赖模拟解决方案,尤其是Squire.js,但似乎它们都适合模拟常规依赖而不是插件响应。

我还查看了像sinon这样的存根库,可能会替换实际require调用,但这似乎有问题。

推荐的做法是什么?text我不想在我的 requirejs 配置中用模拟插件替换整个插件,只是在特定测试中覆盖它的一些响应。

我的设置是 node+mocha+requirejs

编辑

请参阅此示例小提琴项目以查看我与 Squire 的问题:

http://runnable.com/VUBoI0ex6v9Gs-BJ/squirejs-with-plugins-for-node-js-and-hello-world

4

1 回答 1

2

这将模拟你从 requires中得到的东西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加载程序传递的 a。您应该添加require为依赖项:

define(['require', ....], function (require, ....) {

require模块是特殊的,由 RequireJS 保留。它返回对require函数的引用。例如,当您使用 RequireJS 的上下文时,您必须使用它,以便在特定上下文中加载的模块使用require绑定到该上下文的函数。SquireJS 还需要您这样做,以便它可以捕获您对require. 全局require绕过 SquireJS。

于 2015-04-28T11:00:37.827 回答