0

Я пытаюсь написать тесты для функций, которые вызывают функции Async из службы, и я не могу на всю жизнь выяснить, как заставить Jasmine ждать, пока мои операции Async закончатся до выполнения функция ожидания.Сделать Jasmine ждать завершения функции Async

describe('vm.submitLogin', function() { 
    var $scope; 
    var $q; 
    var deferred; 
    var $controller; 

    beforeEach(module('myModule')); 

    beforeEach(inject(function (_$controller_, _$rootScope_, _$q_, LoginService, $httpBackend) { 
     $q = _$q_; 
     $scope = _$rootScope_.$new(); 
     $controller = _$controller_; 
     deferred = _$q_.defer(); 

     spyOn(LoginService, 'login').and.callFake(function() { 
     return $.Deferred().resolve({success: true, twoFactorRequired: false}); 
     }); 

     $httpBackend.expectGET("/data/I/need/to/mock").respond({"uri": "http://localhost:8081/data/I/need/to/mock.json"}); 

     var vm = $controller('LoginCtrl', { $scope: $scope}); 

     vm.submitLogin(); 

     $scope.$apply(); 
    })); 

    it('should work, please work...', inject (function ($httpBackend, LoginService) { 

     expect(something); 

    })); 
    }); 

Я пытался использовать «сделали» функцию Жасмин, но я не могу понять, как идти о его осуществлении.

В этом примере, как только

$scope.$apply(); 

называется, он сразу же подскакивает к ожидать и не потому, что операции асинхронных еще до конца.

+1

Первое, что «инжекционная» обертка является синхронной. Во-вторых, у вас, вероятно, есть проблема XY. Что заставило вас думать, что спецификации должны быть асинхронными? Что делает '$ .Deferred' в угловой спецификации в первую очередь? – estus

ответ

1

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

в $ httpBackend используется в производстве всегда отвечает на запросы асинхронно. Если мы сохраним это поведение при модульном тестировании, нам нужно будет создать асинхронные модульные тесты, которые трудно записать, чтобы следовать и поддерживать. Но ни один из них не может тестировать макет синхронно; что изменило бы выполнение тестируемого кода. По этой причине mock $ httpBackend имеет метод flush(), который позволяет тесту явно очищать ожидающие запросы. Это сохраняет async api бэкэнд, одновременно позволяя тесту выполнить синхронно.

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