2014-11-10 6 views
0

Я написал фабрику с AngularJs, у которой есть метод, который возвращает обещание http.Испытание фабрики угловатых с кармой

'use strict' 

angular.module('projDefinitApp') 
.factory 'testService', ($http) -> 
    { getTest: (testID) -> 
    $http.get "temp/test.json" 
    } 

У меня возникают некоторые проблемы при проведении теста, используя карму и жасмин. Обещание не принесло результата. Я попытался создать var, а затем вызвать функцию и изменить значение var. Но это не обновляет значение:

'use strict' 
describe 'Service: testService', -> 
    # load the service's module 
    beforeEach module 'projDefinitApp' 

    # instantiate service 
    testService = {} 
    beforeEach inject (_testService_) -> 
    testService = _testService_ 

    it 'should do something', -> 
    retrieved = undefined 
    testService.getTest().success ($data,retrieved) -> 
     retrieved = $data 
     return 
    expect(retrieved).toBe(null) 
    return 
    return 

Консоль выхода выглядит следующим образом

PhantomJS 1.9.8 (Linux) Service: testService should do something FAILED

Expected undefined to be null.

ответ

2

в испытаниях, Угловая не сразу выполнять запросы, сделанные $http службы. Причина заключается в том, что все запросы в очереди поставлены в очередь для работы в фазе $digest Углового жизненного цикла. Вам нужно будет выполнить цикл дайджеста Angular вручную в тестах, вызвав $rootScope.$apply() или $httpBackend.flush(), которые будут выполнять внутренний вызов.

Одна из проблем, которые я вижу в текущем тесте, заключается в том, что тесты не выполняются асинхронно, нет гарантии, что retrieved будет установлен до того, как ожидание будет вызвано, поскольку обещания будут разрешены асинхронно. Вы переписывают тесты, чтобы заставить его работать асинхронно:

it 'should do something', (done) -> 
    testService.getTest().success ($data) -> 
    expect($data).toBe(null) 
    done() 
    return 

    $rootScope.$apply() 
    return 
return 
+0

Это, кажется, работает лучше, но держится не работает ... Если я не делаю макет (с использованием httpbackend) обратного вызова не вызывается. Эта ошибка показана «Ошибка: Тайм-аут - Асинхронный обратный вызов не был вызван в течение времени, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL» Введенный вами код указан в вашем примере – fernandezr

+0

@fernandezr Извините, я пропустил '$ rootScope. $ Apply()' part кода, посмотрите на пример снова. Как я уже упоминал ранее, вы также можете использовать '$ httpBackend.flush()', если '$ httpBackend' уже доступен в тесте. – yggie

+0

Код avobe работает, но он начинает делать GET петиции в других местах не только «temp/test.json». Я также вижу, что с использованием $ httpbackend это издевается над петицией GET, но я бы хотел, чтобы, если я позвоню в getTest, этот метод сделает сам запрос на получение, без необходимости насмехаться. Это возможно? – fernandezr

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