Я использую Jasmine для написания своих тестов, но, думаю, у меня возникла бы эта проблема с любым другим фреймворком для тестирования. Допустим, у нас есть модуль foo
с двумя функциями Bar
и Baz
, которые являются конструкторами (но могут быть просто обычными функциями):
var Bar = exports.Bar = function Bar() {
this.baz = new Baz();
};
var Baz = exports.Baz = function Baz() {
};
Теперь я хотел бы протестировать Bar
, но с поддельной реализацией Baz
:
var foo = require('foo');
describe("foo.Bar", function() {
it("initializes its own Baz", function() {
spyOn(foo, 'Baz'); // this replaces foo.Baz with a fake implementation
var bar = new foo.Bar();
expect(foo.Baz).toHaveBeenCalled();
});
});
Проблема в том, что этот тест не пройден, потому что Bar
создает новый Baz
, используя переменную Baz
, которую нельзя изменить извне. Единственное, что было заменено с помощью spyOn()
, это exports.Baz
.
Очевидное решение - написать this.baz = new exports.Baz();
, но это немного неловко. Если у меня есть больше функций, которые я хочу использовать внутри моего модуля, мне придется всегда вызывать их все, используя префикс exports.
. Есть ли здесь другой подход?