AngularJS 测试 - 测试 Promise 回调中的逻辑
AngularJS Testing - Testing Out Logic in Promise Callback
我的控制器中有以下功能:
$scope.submitNote = function(){
myService.addNote($scope.note).then(function(data){
if(data.success === true){
$scope.note = null;
}
else{
// API call failed
}
}, function(){
// Promise call failed
});
};
我设置我的测试环境:
// Mock out fake service
beforeEach(function(){
myService = {
addNote: function(){
deferred = q.defer();
deferred.resolve({
success: true
});
return deferred.promise;
}
};
spyOn(myService, 'addNote').and.callThrough();
});
// Assign controller scope
beforeEach(inject(function($controller, $rootScope, $q){
q = $q;
scope = $rootScope.$new();
$controller('myController', {
$scope: scope,
myService: myService
});
}));
然后测试我的 submitNote()
函数:
describe('submitNote Test', function(){
it('should set scope.note to null after successful service call', function(){
scope.submitNote();
expect(myService.addNote).toHaveBeenCalled();
expect(scope.note).toBe(null);
});
});
第一个 expect
通过,但第二个 expect
没有通过。我的 submitNote()
函数的 then()
回调似乎没有在测试中被调用。
如何确保调用原始函数中的 promise 回调?
为了让您可以更好地控制 ngMock
模块以提供更清晰的测试,扩展了各种核心服务,以便可以以同步方式检查和控制它们。
Promise 回调在摘要循环期间执行,在您的测试环境中您需要手动启动。
例如:
describe('submitNote Test', function () {
it('should set scope.note to null after successful service call', function () {
scope.submitNote();
scope.$digest();
expect(myService.addNote).toHaveBeenCalled();
expect(scope.note).toBe(null);
});
});
我的控制器中有以下功能:
$scope.submitNote = function(){
myService.addNote($scope.note).then(function(data){
if(data.success === true){
$scope.note = null;
}
else{
// API call failed
}
}, function(){
// Promise call failed
});
};
我设置我的测试环境:
// Mock out fake service
beforeEach(function(){
myService = {
addNote: function(){
deferred = q.defer();
deferred.resolve({
success: true
});
return deferred.promise;
}
};
spyOn(myService, 'addNote').and.callThrough();
});
// Assign controller scope
beforeEach(inject(function($controller, $rootScope, $q){
q = $q;
scope = $rootScope.$new();
$controller('myController', {
$scope: scope,
myService: myService
});
}));
然后测试我的 submitNote()
函数:
describe('submitNote Test', function(){
it('should set scope.note to null after successful service call', function(){
scope.submitNote();
expect(myService.addNote).toHaveBeenCalled();
expect(scope.note).toBe(null);
});
});
第一个 expect
通过,但第二个 expect
没有通过。我的 submitNote()
函数的 then()
回调似乎没有在测试中被调用。
如何确保调用原始函数中的 promise 回调?
为了让您可以更好地控制 ngMock
模块以提供更清晰的测试,扩展了各种核心服务,以便可以以同步方式检查和控制它们。
Promise 回调在摘要循环期间执行,在您的测试环境中您需要手动启动。
例如:
describe('submitNote Test', function () {
it('should set scope.note to null after successful service call', function () {
scope.submitNote();
scope.$digest();
expect(myService.addNote).toHaveBeenCalled();
expect(scope.note).toBe(null);
});
});