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