使用 $resource 响应测试执行服务的控制器
Testing a controller that execute a service with $resource response
我有一个使用服务的控制器,解决一个承诺,然后设置一个变量。
我想测试是否设置了变量,我该怎么做?
Service.js
angular
.module('myModule')
.service('MyService',['$resource',function($resource){
var r = $resource('/users/:id',{id:'@id'});
this.post = function(_user){
return (new r(_user)).$save()
}
}])
控制器
angular
.module('myModule')
.controller('myCtrl', ['MyService',function(MyService){
var vm = this;
vm.value = 0;
vm.post = function(_user){
MyService.post(_user).then(function(){
vm.value = 1;
});
};
}])
controller_spec
describe('Test Controller',function(){
beforeEach(module('myModule'));
beforeEach(inject(function($controller, MyService){
this.ctrl = $controller('myCtrl');
}))
it('after save value is 1',function(){
this.ctrl.post({name: 'chuck'});
//Always this.ctrl.value it's equal to 0
expect(this.ctrl.value).toBeEqual(1);
});
});
模拟服务方法和return一个承诺,然后在需要时解决它。
describe('Test Controller',function(){
var postDefer;
beforeEach(module('myModule'));
beforeEach(inject(function($controller, MyService, $q){
postDefer = $.defer();
spyOn(MyService, 'post').and.returnValue(postDefer.promise);
this.ctrl = $controller('myCtrl', {MyService : MyService});
}))
it('after save value is 1',function(){
this.ctrl.post({name: 'chuck'});
postDefer.resolve();
scope.$apply();
expect(this.ctrl.value).toBeEqual(1);
});
});
我有一个使用服务的控制器,解决一个承诺,然后设置一个变量。 我想测试是否设置了变量,我该怎么做?
Service.js
angular
.module('myModule')
.service('MyService',['$resource',function($resource){
var r = $resource('/users/:id',{id:'@id'});
this.post = function(_user){
return (new r(_user)).$save()
}
}])
控制器
angular
.module('myModule')
.controller('myCtrl', ['MyService',function(MyService){
var vm = this;
vm.value = 0;
vm.post = function(_user){
MyService.post(_user).then(function(){
vm.value = 1;
});
};
}])
controller_spec
describe('Test Controller',function(){
beforeEach(module('myModule'));
beforeEach(inject(function($controller, MyService){
this.ctrl = $controller('myCtrl');
}))
it('after save value is 1',function(){
this.ctrl.post({name: 'chuck'});
//Always this.ctrl.value it's equal to 0
expect(this.ctrl.value).toBeEqual(1);
});
});
模拟服务方法和return一个承诺,然后在需要时解决它。
describe('Test Controller',function(){
var postDefer;
beforeEach(module('myModule'));
beforeEach(inject(function($controller, MyService, $q){
postDefer = $.defer();
spyOn(MyService, 'post').and.returnValue(postDefer.promise);
this.ctrl = $controller('myCtrl', {MyService : MyService});
}))
it('after save value is 1',function(){
this.ctrl.post({name: 'chuck'});
postDefer.resolve();
scope.$apply();
expect(this.ctrl.value).toBeEqual(1);
});
});