2016-09-07 90 views
0

我有一個服務是這樣的:噶 - 窺探功能錯誤處理

app.service('usersService.v2', ['$http', '$q', '$exceptionHandler', 'User', 'userValidator.v2', 'CRUD', function($http, $q, $exceptionHandler, User, userValidator, CRUD){ 
    function dummyPromise(){ 
     var dummyDeferred = $q.defer(); 
     dummyDeferred.resolve('dummy'); 

     return deferred.promise; 
    } 

    this.getUser = function(userID, companyID){ 
     try{ 
      userValidator.validateId(userID); 
      userValidator.validateId(companyID); 
     } 
     catch(e){ 
      $exceptionHandler(e); 
      return dummyPromise(); 
     } 

     return $http.get(apiUrl + 'api/v2/companies/' + companyID + '/users/' + userID) 
      .then(function(response){ 
       var user = new User(response.data); 

       try{ 
        userValidator.validateUser(CRUD.READ, user); 
       } 
       catch(e){ 
        $exceptionHandler(e); 
        return; 
       } 

       return user; 
      }) 
    }; 
}]); 

,基本上我想測試取決於什麼驗證功能做這個服務的行爲。 userValidator.*函數是if/else塊引發錯誤。

在噶我有這樣的事情:

describe('Service: usersService.v2', function() { 
    var usersService, httpBackend, state, userValidator; 
    const url = 'address' 

    function _inject() { 
     angular.mock.inject(function ($injector) { 
      usersService = $injector.get('usersService.v2'); 
      userValidator = $injector.get('userValidator.v2'); 
      httpBackend = $injector.get('$httpBackend'); 
     }); 
    } 

    beforeEach(function() { 
     angular.mock.module('app'); 
     _inject(); 
    }); 

    describe('getUser', function() { 
     beforeEach(function() { 
      httpBackend.when('GET', url); 
     }); 
     afterEach(function() { 
      httpBackend.verifyNoOutstandingExpectation(); 
      httpBackend.verifyNoOutstandingRequest(); 
     }); 

    it('should return a dummy promise if ID validation fails', function(){ 
      spyOn(userValidator, 'validateId').and.throwError('Missing or wrong ID thrown'); 
      usersService.getUser() 
       .then(function(data){expect(data).toBe('dummy');}) 
     }); 
    )}; 
}) 

,但是當我跑噶我得到一個錯誤,因爲這將是,如果我沒有把catch處理厚望及以下代碼塊不被執行。

我在做什麼錯?

乾杯, 曼努埃爾


UPDATE: 驗證方法是這樣的:

... code code code ... 
this.validateId = function(ID){ 
    if(!ID || !angular.isNumber(ID)) throw 'Missing or wrong ID'; 
} 

因此,我的問題是,噶正試圖處理由驗證拋出,而不是錯誤讓userService做到這一點。

回答

0

您正在測試usersService.v2。您無法同時測試userValidator.v2,但可以模擬userValidator.v2服務。

var userValidator; 
beforeEach(function() { 

    module(function($provider) { 
     userValidator = { 
      validateId: function(id) { 

       if (id === 123 ||id === 456) { //put your mock test id here for PASS case 
        return true 
       } 
       return false; 
      } 
     } 
     $provider.value('userValidator.v2', userValidator); 
    }) 
}); 
describe('getUser', function() { 
     beforeEach(function() { 
      httpBackend.when('GET', url) 
      .respond(200, { 
        data: "dummy" 
       });; 
     }); 

    it('should return a dummy promise if ID validation fails', function() { 

     usersService.getUser(9879,8798) //Its FAILED case 
      .then(function(data) { expect(data).toBe('dummy'); }) 

    }) 
}) 
+0

對不起,我不是很清楚,我剛剛更新的問題:d我的方法不返回布爾,但他們幾乎沒有扔 – Phugo

+0

無法測試,但模擬'userValidator.v2' –

+0

這不是錯誤嘲笑'spyOn(userValidator,'validateId').throwError('缺少或錯誤的ID拋出');'? – Phugo