Javascript 如何在单元测试中模拟RequireJs加载程序插件响应

Javascript 如何在单元测试中模拟RequireJs加载程序插件响应,javascript,unit-testing,mocking,requirejs,squirejs,Javascript,Unit Testing,Mocking,Requirejs,Squirejs,我试图测试的代码依赖于RequireJs。例如: 对于特定的单元测试,我试图模拟文本的响应!模板/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 lo

我试图测试的代码依赖于RequireJs。例如:

对于特定的单元测试,我试图模拟
文本的响应!模板/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依赖项模拟,但它们似乎都适合模拟常规依赖项,而不是插件响应

我还研究了存根库,它们可能会替换实际的
require
调用,但这似乎有问题

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

我的设置是node+mocha+requirejs

编辑

请参阅此fiddle项目示例,了解我与Squire之间的问题:


这将模拟您从要求
文本中获得的结果!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保留。它返回对
require
函数的引用。例如,当您使用RequireJS的上下文时,必须使用它,以便在特定上下文中加载的模块使用绑定到该上下文的
require
函数。SquireJS还需要您这样做,以便它能够捕获您对
require
的调用。全局
require
绕过了SquireJS。

尝试了这一点,但不起作用,因为插件与require()和not define()一起使用。请看这个例子fiddle:“不工作?”我在回答中输入的代码经过测试,运行非常好。看看我发布的runnable。当然,您的代码工作得很好,但我的用例略有不同。runnable显示了区别。你,我的朋友,太棒了!万分感谢,我完全错过了RequireJs文档中关于通过require的部分
define(['require', ....], function (require, ....) {