2015-07-06 1 views
0

Я пытаюсь проверить службу в Angular, которая использует $ http, но примерно через 5 секунд (время ожидания жасмина) я получаю:

Ошибка: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL.

Ошибка: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL.

Я пытался использовать $ rootScope. $ Digest(), но это, похоже, не имело никакого значения. Тесты (и код приложения) написаны в машинописном машинописном тексте, и код действительно работает в реальном приложении.

Я не вижу предупреждения/журнала, говорящего, что then() запустился, но мне удалось получить предупреждение с помощью setTimeout() в тесте (никаких изменений в приложении), но я все еще получал ошибки.

Код испытания

var $httpBackend, orderSearchService; 
 
     beforeEach(inject((_$httpBackend_, _orderSearchService_) => { 
 
      $httpBackend = _$httpBackend_; 
 
      orderSearchService = _orderSearchService_; 
 
      $httpBackend.expectGET("http://testUrl/api/search/testquery"); 
 
      $httpBackend.whenGET("http://testUrl/api/search/testquery").respond(200, "testData"); 
 
     })); 
 

 
     it("can call $http and retrieve results",(done) => { 
 
      orderSearchService.search("testquery").then(promise => { 
 
       var results = promise.data; 
 
       alert(results); 
 
       expect(results).toBe("testData"); 
 
       $httpBackend.flush(); 
 
       done(); 
 
      }); 
 
     });

Отрывок из службы:

public search(term: string): angular.IPromise<any> { 
     var result: angular.IPromise<any> = this.httpService.get("http://testUrl" + "/api/search/" + term) 
      .success((data: any) => { return data }); 
     return result; 
    } 

Мое понимание, что тест должен быть вызовом поиска(), и жасмин следует ждать готовности() к называться.

+0

You Пропустил вызов метода '$ digest()' в модульном тесте. Угловой не знает, когда следует выполнить метод .then() ' –

ответ

1

После перевода на JavaScript будет выглядеть следующим образом (как $httpBackend.flush() работает переваривать цикл внутри) Я также извлекать параметры запроса объекта, чтобы остановить нарушение DRY

angular 
 
    .module('app', []) 
 
    .service('orderSearchService', function($http) { 
 
    this.search = function(term) { 
 
     return $http.get("http://testUrl" + "/api/search/" + term).success(function(data) { 
 
     return data; 
 
     }) 
 
    } 
 
    }); 
 

 

 

 
describe('orderSearchService', function() { 
 
    var $httpBackend, orderSearchService; 
 

 
    beforeEach(module('app')); 
 

 
    beforeEach(inject(function(_$httpBackend_, _orderSearchService_) { 
 
    $httpBackend = _$httpBackend_; 
 
    orderSearchService = _orderSearchService_; 
 
    })); 
 

 
    it("can call $http and retrieve results", function() { 
 
    var query = { 
 
     q: 'testquery', 
 
     response: 'testData' 
 
    }; 
 

 

 
    $httpBackend.expectGET(/http:\/\/testUrl\/api\/search/); 
 
    $httpBackend.whenGET(new RegExp('http://testUrl/api/search/' + query.q)).respond(200, query.response); 
 

 
    orderSearchService.search(query.q).then(function(promise) { 
 
     var results = promise.data; 
 
     expect(results).toBe(query.response); 
 
    }); 
 
    $httpBackend.flush(); 
 
    }); 
 
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

+0

Спасибо, я внес изменения в машинописный текст, и мне также пришлось удалить неиспользуемый $ обеспечить в ранее beforeEach(). Я не уверен, почему он все еще был сломан с помощью $ extra. – ChrisFletcher

+0

Вы вызвали метод '$ httpBackend.flush()', который был недоступен для Angular, поскольку 'then' выполняется после' flush() ' –