我如何使用 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.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')
也许我遗漏了一些东西,但是 jasmine.createSpyObj
制作了没有任何附加实现的新间谍。相反,您想要的是一个调用原始函数的间谍,因为您的承诺链假定 patientCache.saveCurrentPatient
存在。尝试使用 spyOn(obj, 'patientCache').and.callThrough()
语法设置你的间谍。请注意,为了执行此操作,您需要将要测试的方法嵌入对象 obj
:
var obj = {
patientCache: patientCache // where patientCache is the actual service
}
当然,如果你确实想模拟这些服务,你可以注入附加了假实现的间谍......使用 Jasmine 的 and.returnValue
或 and.callFake
.
我的控制器代码有:
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')
也许我遗漏了一些东西,但是 jasmine.createSpyObj
制作了没有任何附加实现的新间谍。相反,您想要的是一个调用原始函数的间谍,因为您的承诺链假定 patientCache.saveCurrentPatient
存在。尝试使用 spyOn(obj, 'patientCache').and.callThrough()
语法设置你的间谍。请注意,为了执行此操作,您需要将要测试的方法嵌入对象 obj
:
var obj = {
patientCache: patientCache // where patientCache is the actual service
}
当然,如果你确实想模拟这些服务,你可以注入附加了假实现的间谍......使用 Jasmine 的 and.returnValue
或 and.callFake
.