Как я могу юнит-тестировать цепь обещаний с помощью кармы?
Мой код контроллера имеет:
save: function () {
var that = this;
patientCache.saveCurrentPatient().then(function(){
return adherenceCache.updateAdherenceSchedule(that.model.patientId)
}).then(function () {
that.buildAdherenceUrl();
});
},
Я хочу проверить patientCache.saveCurrentPatient()
, adherenceCache.updateAdherenceSchedule
и that.buildAdherenceUrl
называются.
Вот мой тест:
beforeEach(function() {
module('mapApp');
return inject(function($injector) {
var $controller, $rootScope;
$rootScope = $injector.get('$rootScope');
$controller = $injector.get('$controller');
scope = $rootScope.$new()
$modalMock = jasmine.createSpyObj('$modal', ['open']);
adherenceCacheMock = jasmine.createSpyObj('adherenceCache', ['getAdherenceSchedule']);
patientCacheMock = jasmine.createSpyObj('patientCache', ['saveCurrentPatient']);
$controller('PatientAdherenceController', {
$scope: scope,
$modal: $modalMock,
adherenceCache: adherenceCacheMock,
patientCache: patientCacheMock
});
return scope.$digest();
});
});
fit('should save the patient and update the adherence schedule on save', function() {
scope.save();
expect(patientCacheMock.saveCurrentPatient).toHaveBeenCalled();
});
Однако я получаю ошибку:
TypeError: 'undefined' is not an object (evaluating 'patientCache.model.currentPatient')
1 ответ:
Возможно, я что-то упускаю, но
jasmine.createSpyObj
делает новых шпионов без каких-либо реализаций, привязанных к ним. Вместо этого вам нужен Шпион, который вызывает исходную функцию, поскольку ваша цепочка обещаний предполагает, чтоpatientCache.saveCurrentPatient
существует. Попробуйте настроить своих шпионов с помощью синтаксисаspyOn(obj, 'patientCache').and.callThrough()
. Обратите внимание, что для этого вам нужно будет встроить свои методы для тестирования в объектobj
:var obj = { patientCache: patientCache // where patientCache is the actual service }
Конечно, если вы хотите издеваться над этими услугами, вы можете ввести шпионов, которые имеют поддельные реализация прилагается вместо ... используйте Жасмин
and.returnValue
илиand.callFake
.