Как я могу юнит-тестировать цепь обещаний с помощью кармы?


Мой код контроллера имеет:

        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 4

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.