2017-01-03 4 views
1

У меня есть этот тест жасмин, и, наконец, положение на обещание, кажется, не будет получать казнены, как я получаю ошибку:Наконец положение обещания никогда не получать казнены в тесте Jasmine

PhantomJS 2.1.1 (Mac OS X 0.0.0) Service: petsFactory .getPetsAsync() should return a list of pets FAILED 
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

Мой тестовый файл выглядит как:

'use strict'; 

describe('Service: petsFactory', function() { 

    // load the service's module 
    beforeEach(module('smokeTestApp')); 

    // instantiate service 
    var petsFactory; 
    beforeEach(inject(function (_petsFactory_) { 
    petsFactory = _petsFactory_; 
    })); 

    describe('.getPetsAsync()', function() { 
    it('should return a list of pets', function (done) { 

     var testPets = function (pets) { 
     expect(Array.isArray(pets)).toBe(true); 
     } 

     var failTest = function(error) { 
     expect(error).toBeUndefined(); 
     }; 

     petsFactory 
     .getPetsAsync() 
     .then(testPets) 
     .catch(failTest) 
     .finally(done); 
    }); 
    }); 
}); 

Соответствующий фабричный метод выглядит следующим образом:

var getPetsAsync = function() { 
    return $q.when(pets); 
}; 

содержание домашних животных Vari способный полностью синхронный, обещание - это просто обертка по синхронной стоимости, которая есть тут же.

Что здесь общего не работает?

+0

ли 'затем' функция привлеченным? Кроме того, вы обычно вводите $ q на завод? У меня была аналогичная проблема в прошлом, потому что я вмешивался с угловым инжектором, вместо обычной инъекции в контроллерах/службах. –

+0

$ q вводится нормально. Возможно, тогда его не вызывают. Я просто попытался сделать исключение в функции testPets и все еще получил ту же ошибку в Jasmine. Хотя, это было бы действительно странно, поскольку я использую, когда обертывать синхронное значение. –

ответ

1

Из documentation:

When testing promises, it's important to know that the resolution of promises is tied to the digest cycle. That means a promise's then, catch and finally callback functions are only called after a digest has run. In tests, you can trigger a digest by calling a scope's $apply function. If you don't have a scope in your test, you can inject the $rootScope and call $apply on it. There is also an example of testing promises in the $q service documentation.

Так просто впрыснуть $rootScope и использовать $apply:

petsFactory 
    .getPetsAsync() 
    .then(testPets) 
    .catch(failTest) 
    .finally(done); 

$rootScope.$apply();