たとえば、インラインの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
呼び出すため、失敗します。回避策は、グローバル スコープで置き換えることです。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();
});
});
より良い方法はありますか?そうでない場合は、これが同じ問題に遭遇している他の人に解決策を提供することを願っています.