2017-03-14 59 views
0

我想寫一個錯誤服務的spec文件的測試,我不斷收到超時我的規範只有這一個方法。我在不同的.factory文件中使用了其他基於承諾的方法,但由於某種原因,這給了我一些解決或拒絕承諾的問題。這兩者似乎都不起作用。

FAILED TESTS: 
errorService Test 
Test errorService routeError functionality 
    ✖ should test that a route error has return value of "error logged" 
    Firefox 51.0.0 (Mac OS X 10.12.0) 
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. in node_modules/jasmine-core/lib/jasmine-core/jasmine.js (line 1973) 
    attemptAsync/timeoutId<@node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1973:23 

這是我試圖運行的.spec.js文件。所有的注入都是由於我試圖弄清楚我是否錯過了正在加載或未加載的東西。

let httpInterceptor, errorService, $translate, $q, $uibModal, $location, $state; 

beforeEach(module('core', function($translateProvider){ 
    $translateProvider.translations('en_US', {}) 
})); 

beforeEach(inject(function ($injector) { 
    httpInterceptor = $injector.get('httpInterceptor'); 
    errorService = $injector.get('errorService'); 
    $translate = $injector.get('$translate'); 
    $q = $injector.get('$q'); 
    $uibModal = $injector.get('$uibModal'); 
    $location = $injector.get('$location'); 
    $state = $injector.get('$state'); 
})); 

describe('Test errorService routeError functionality', function() { 
    it('should test that a route error has return value of "error logged"', function (done) { 
     // const error = errorService.routeError(routeError); 
     // expect(error).toBe('error logged'); 

     errorService.routeError(routeError) 
      .then(function (res) { 
       console.log('routeError unit test res', res); 
       // expect(res).toBe('error logged'); 
       done(); 
      }, function (err) { 
       console.log('routeError unit test err', err); 
       // expect(err).toBe(null); 
       done(); 
      }) 
    }) 

}); 

這是被引用的服務。

function errorService($q, $uibModal, $translate, $state){ 
    const service = { 
     routeError: routeError, 
     clientError: clientError, 
     tunnelError: tunnelError 
    }; 
    return service; 

    function routeError(err) { 
     // return 'error logged'; 
     return $q(function (resolve, reject) { 
      console.error('ui-router error', err); 
      reject('error logged'); 
     }); 
    } 
} 
angular.module('core') 
    .factory('errorService', errorService); 
errorService.$inject = ['$q', '$uibModal', '$translate', '$state']; 

回答

0

顯然我需要做的是設置一個範圍,並在它的函數結束時運行scope.digest()。

例如

beforeEach(inject(function($injector){ 
    errorService = $injector.get('errorService'); 
    httpInterceptor = $injector.get('httpInterceptor'); 
    scope = $injector.get('$rootScope').$new(); 
})); 

並用於測試本身。

describe('Test errorService routeError functionality', function() { 

    it('should test that a route error has return value of "error logged"', function (done) { 
     errorService.routeError(routeError) 
      .catch(function (err) { 
       console.log('routeError unit test err', err); 
       expect(err).toBe('error logged'); 
       done(); 
      }); 
     scope.$digest(); 
    }) 
});