2015-10-23 4 views
1

я нашел несколько постов, которые показывает этот код как способ сделать блок асинхронной тестирования:AngularJS, мокко, Chai: тестирование услуг с обещаниями

Услуга:

angular.module('miservices', []) 
.service('myAppServices', ['$http', 'httpcalls', function($http, httpcalls) { 
    this.getAccountType = function(){ 
     return httpcalls.doGet('http://localhost:3010/...').then(function(data){ 
      return data; 
     }, function(error){ 
      ... 
     }); 
    }; 
    ... 

Тест:

describe('testing myAppServices', function(){ 

beforeEach(module('smsApp')); 
it('should handle names correctly', inject(function(myAppServices){ 
    myAppServices.getAccountType() 
    .then(function(data) { 
     expect(data).equal({...}); 
}); 
... 

Мы используем AngularJS, Mocha, Chai, и у нас установлен Sinon.

Тест никогда не доходит до части .then, но почему?

Спасибо!

+1

Проблема не обещание, а $ http. Вы должны высмеивать запросы, и вы этого не делаете. – estus

+0

Вы хотите сказать httpBackend? – Ramon

+1

Правильно. Если doGet и getAccountType ничего не делают для фактического ответа HTTP, вы можете пропустить эту спецификацию и высмеять getAccountType для других спецификаций. – estus

ответ

0

Если вы тестируете свою услугу, я бы рекомендовал высмеять вашу службу «httpcalls» (поскольку это не доступно для этого теста).

Чтобы издеваться над этим, у вас может быть несколько способов, один подход состоит в том, чтобы иметь модуль mocks, который вы используете только с вашими модульными тестами.

angular.module('miservices.mocks', []) 
.service('httpcalls', ['$q', function($q) { 
    this.returnGet = ''; 
    this.doGet = function(url) { 
      return $q.when(this.returnGet); 
     }; 
    }; 

А ваше модульное тестирование, то будет что-то вроде:

describe('testing myAppServices', function(){ 

beforeEach(function() { 
module('smsApp'); 
module('miservices.mocks'); 
}); 
it('should handle names correctly', inject(function(myAppServices, httpcalls){ 
    httpcalls.returnGet = 'return data'; 
    myAppServices.getAccountType() 
    .then(function(data) { 
     expect(data).equal('return data'); 
}); 
... 

Поскольку мы вставляем модуль издевается после модуля приложения, httpcalls службы получает перезаписана его макет версии и позволяет нам тестировать должным образом myAppServices без дополнительных зависимостей.

+0

Спасибо @pedromarce, я попробую – Ramon

Смежные вопросы