В настоящее время мы пытаемся проверить наши угловые службы, которые используют обещания вернуть значения контроллерам. Проблема в том, что функции, которые мы прикрепляем к., Не вызываем в Жасмине.
Мы обнаружили, что добавление функции $ rootScope.digest() в функцию после возврата обещания позволяет синхронно выполнять обещания, но по-прежнему не работает для асинхронных обещаний.
код до сих пор
beforeEach(inject(function (Service, $rootScope)
{
service = Service;
root = $rootScope;
}));
it('gets all the available products', function (done)
{
service.getData().then(function (data)
{
expect(data).not.toBeNull();
expect(data.length).toBeGreaterThan(0);
done();
});
root.$digest();
});
В этом случае обещание вызывается нормально, но если это асинхронное это будет называться не потому, что обещание не готов к «переваривания» к тому времени корень. Вызывается $ digest().
Есть ли способ рассказать, когда обещание после решения принято, чтобы я мог вызвать дайджест? Или может быть что-то, что сделает это автоматически? Спасибо;)
Частичной службы мы должны проверить (обработка ошибок удалена):
var app = angular.module('service', []);
/**
* Service for accessing data relating to the updates/downloads
* */
app.factory('Service', function ($q)
{
... init
function getData()
{
var deffered = $q.defer();
var processors = [displayNameProc];
downloads.getData(function (err, data)
{
chain.process(processors, data, function (err, processedData)
{
deffered.resolve(processedData);
});
});
return deffered.promise;
}
...
В том случае, когда есть проблема, когда service.getData является асинхронным обещание решено, но функция прилагается к этому обещанию из тестового кода не вызывается, потому что корневой. $ digest уже вызван. Надеюсь, что это дает больше информации
Обход
var interval;
beforeEach(inject(function ($rootScope)
{
if(!interval)
{
interval = function()
{
$rootScope.$digest();
};
window.setInterval(interval, /*timing*/);
}
}));
Я закончил с использованием обходного пути выше, чтобы позвонить дайджесту неоднократно, так что каждый слою обещания бы получить шанс бежать ... его не идеал или довольно но это работает для теста ...
Вы издевательский вашей службы и, следовательно, возвращенный обещание? – CainBot
Нет. Я пытался проверить фактическое обслуживание. – BrendanM
Если вы тестируете фактический сервис и внутренне используете службу $ http, то я считаю, что дайджест будет вызываться angularjs, когда удаленный вызов удастся или не удастся. – CainBot