У меня есть следующая простая услуга
app.factory('Shoes', function() {
function a() {return 12;}
function b() {return a();}
return {
a: a,
b: b
}
})
Я хочу проверить, вызван ли метод a
при вызове метода b
. Мой тест выглядит так:
describe('Testing a Shoes service', function() {
var service;
beforeEach(module('plunker'));
beforeEach(inject(function(Shoes) {
service = Shoes;
}))
it('.b should call .a', function() {
spyOn(service, 'a');
service.b();
expect(service.a).toHaveBeenCalled();
})
});
Но тесты терпят неудачу. Релевантный плункер находится здесь.
Вопрос в том, как я могу проверить такие взаимодействия?
Что здесь происходит, так это то, что вы устанавливаете шпион по методу service.a
, но внутренний a
(который внутренне называется b
) остается тем же внутренним методом (то есть не шпионом), поэтому ваш тест терпит неудачу.
Если вы действительно хотите это сделать, единственный способ - не вызвать внутренний a
а метод вашего сервиса:
app.factory('Shoes', function() {
return {
a: function a() {
return 12;
},
b: function b() {
return this.a();
}
};
});
Вот обновление вашего plunkr: https://plnkr.co/edit/6FZptdcX9qwyOE6kbgAX
РЕДАКТИРОВАТЬ:
Просто некоторые объяснение: service.a
метод просто указатель на внутренний a
методе. Когда вы говорите spyOn(service, 'a')
, вы просто перезаписываете указатель service.a
указывающий на совершенно другой метод (т.е. Шпион, созданный жасмином). Внутренний метод является частным и никогда не будет обновляться, так что, если вы звоните a
a()
во внутреннем b
методе, вы просто вызываете оригинальный метод не шпион указал на a
service.a
.
Мне удалось исправить эту проблему следующим кодом
app.factory('Shoes', function() {
var module = {
a:function(){
return 12;
},
b: function(){
return this.a();
}
}
return module;
});
Кажется, что ваш тестируемый модуль не может просто вызвать "функцию". Он должен вызывать метод возвращаемого объекта;
Обновлен Plunker: https://plnkr.co/edit/DeDmdQq3rguO6uGHElW6?p=preview
service.a
? Разве ссылки не должны быть разрешены на оригинальные функции?
app.factory('Shoes', function() {
var self = {
a: function() {return 12;},
b: function() {return this.a();}
}
return {
a: self.a,
b: self.b
}
})
Я считаю, что, поскольку b не вызывает функцию, на которую вы следите. С фабрикой над испытательными проходами.
service.a
? Разве ссылки не должны быть разрешены на оригинальные функции?
service.a
?