2

たとえば、インラインのrequireで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呼び出すため、失敗します。回避策は、グローバル スコープで置き換えることです。requiresquire.requirerequire

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