Как заглушить require () / ожидать вызовов «корневой» функции модуля?

Рассмотрим следующую спецификацию жасмина:

describe("something.act()", function() {
  it("calls some function of my module", function() {
    var mod = require('my_module');
    spyOn(mod, "someFunction");
    something.act();
    expect(mod.someFunction).toHaveBeenCalled();
  });
});

Это работает отлично. Что-то вроде этого делает его зеленым:

something.act = function() { require('my_module').someFunction(); };

А теперь взгляните на этот:

describe("something.act()", function() {
  it("calls the 'root' function of my module", function() {
    var mod = require('my_module');
    spyOn(mod); // jasmine needs a property name
                // pointing to a function as param #2
                // therefore, this call is not correct.
    something.act();
    expect(mod).toHaveBeenCalled(); // mod should be a spy
  });
});

Это код, который я хотел бы протестировать с помощью этой спецификации:

something.act = function() { require('my_module')(); };

Это несколько раз сбивало меня с толку за последние несколько месяцев . Одно из теоретических решений - заменить require () и вернуть шпион, созданный с помощью createSpy (). НО require () - непреодолимое чудовище: это отдельная «копия» функции в каждом исходном файле / модуле. Устранение его в спецификации не заменит реальную функцию require () в исходном файле "testee".

Альтернативой является добавление поддельных модулей в путь загрузки, но мне это кажется слишком сложным.

Есть идеи?

8
задан jbpros 9 August 2011 в 14:06
поделиться