Асинхронный обратный вызов не был вызван в течение тайм-аута - модульное тестирование службы Typescript & Angular $ http

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

Я понимаю, что тест должен вызывать search(), и что Жасмин должен ждать выполнения done() для вызова.

Теги:
unit-testing
asynchronous
jasmine

1 ответ

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
    Спасибо, я сделал изменения обратно в Typescript, и мне также пришлось удалить неиспользованный $ обеспечить в более раннем beforeEach (). Я не уверен, почему это все еще сломалось с $ обеспечить.
  • 0
    Вы вызвали $httpBackend.flush() внутри, который был недоступен для Angular, поскольку then выполняется после flush()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню