2

我将 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必须以squire某种方式绑定到对象,我使用下划线来执行此操作),但由于时间原因仍不会调用间谍。测试也必须更改为

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

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

4

1 回答 1

4

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

所以:

define(['require', 'someDep'], function (require, someDep) {
  return {
    someFn: function() {
      require(['anotherDep'], function(anotherDep) {
        anotherDep.anotherFn();
      });
    }
  } 
});
于 2014-10-09T16:31:03.450 回答