Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 测试使用$resource response执行服务的控制器_Angularjs_Testing_Jasmine_Ngresource - Fatal编程技术网

Angularjs 测试使用$resource response执行服务的控制器

Angularjs 测试使用$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)).

我有一个控制器,它使用一个服务,解析一个承诺,然后设置一个变量。 我想测试变量是否已设置,如何设置

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;
      });
  };


}])
控制器规格

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刚刚发生了一个异步事件。在这种情况下,您刚刚解决了一个承诺。