Рассмотрим следующую спецификацию жасмина:
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".
Альтернативой является добавление поддельных модулей в путь загрузки, но мне это кажется слишком сложным.
Есть идеи?