我如何使用 Karma 对承诺链进行单元测试?

How can I unit test a promise chain with Karma?

我的控制器代码有:

        save: function () {
            var that = this;
            patientCache.saveCurrentPatient().then(function(){
                return adherenceCache.updateAdherenceSchedule(that.model.patientId)
            }).then(function () {
                that.buildAdherenceUrl();
            });
        },

我想测试 patientCache.saveCurrentPatient()adherenceCache.updateAdherenceSchedulethat.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')

也许我遗漏了一些东西,但是 jasmine.createSpyObj 制作了没有任何附加实现的新间谍。相反,您想要的是一个调用原始函数的间谍,因为您的承诺链假定 patientCache.saveCurrentPatient 存在。尝试使用 spyOn(obj, 'patientCache').and.callThrough() 语法设置你的间谍。请注意,为了执行此操作,您需要将要测试的方法嵌入对象 obj:

var obj = {
  patientCache: patientCache // where patientCache is the actual service
}

当然,如果你确实想模拟这些服务,你可以注入附加了假实现的间谍......使用 Jasmine 的 and.returnValueand.callFake.