2016-03-23 89 views
0

我有一個控制器使用服務,解析一個承諾然後設置一個變量。 我想測試變量是否已經設置,我該如何做?

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

}); 

回答

2

模擬的服務方法,並返回一個承諾,那麼解決它,當你需要它。

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

}); 
+0

感謝哥們!這對我有效。 –

+0

爲什麼'then'方法執行時,我的值更新,當我使用範圍。$ apply()方法??這是因爲'then'方法提供的函數仍在等待'$ digest'進程?如果有人幫助我理解這一點,我會非常優雅。 –

+1

你需要$ scope。$ apply(),告訴AngularJS剛剛發生了異步事件。在這種情況下,你只是解決了一個承諾。 – sdfacre

相關問題