Angularjs 测试使用$resource response执行服务的控制器
我有一个控制器,它使用一个服务,解析一个承诺,然后设置一个变量。 我想测试变量是否已设置,如何设置 Service.jsAngularjs 测试使用$resource response执行服务的控制器,angularjs,testing,jasmine,ngresource,Angularjs,Testing,Jasmine,Ngresource,我有一个控制器,它使用一个服务,解析一个承诺,然后设置一个变量。 我想测试变量是否已设置,如何设置 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)).
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;
});
};
}])
控制器规格
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);
});
});
模拟服务方法并返回承诺,然后在需要时解决它
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);
});
});
模拟服务方法并返回承诺,然后在需要时解决它
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);
});
});
为什么要执行
then
方法,并在使用scope时更新我的值。$apply()方法??这是因为then
方法中提供的函数仍在等待$digest
过程?如果有人能帮助我理解这一点,我会非常高兴的。你需要调用$scope.$apply(),告诉AngularJS刚刚发生了一个异步事件。在本例中,您刚刚解析了一个承诺。为什么在使用作用域时执行然后方法并更新我的值。$apply()方法??这是因为then
方法中提供的函数仍在等待$digest
过程?如果有人能帮助我理解这一点,我会非常高兴的。你需要调用$scope.$apply(),告诉AngularJS刚刚发生了一个异步事件。在这种情况下,您刚刚解决了一个承诺。