Obecnie próbujemy przetestować nasze usługi kątowe, które wykorzystują obietnice zwracania wartości kontrolerom. Problem polega na tym, że funkcje, które przywiązujemy do. Then, nie są wywoływane w Jasmine.
Odkryliśmy, że dodanie $ rootScope.digest() do funkcji po zwróceniu obietnicy pozwala na zwołanie synchronicznych obietnic, jednak nadal nie działa w przypadku asynchronicznych obietnic.
Kod jakim jest
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();
});
W tym przypadku obietnica zostanie wywołany w porządku, ale jeśli to jest asynchroniczne nie zostanie wywołana, ponieważ obietnica nie jest gotowy do „trawienia” przez czas korzeniowego. Wywoływana jest funkcja $ digest().
Czy jest jakiś sposób, aby powiedzieć, kiedy obietnica jest po rozwiązaniu, abym mógł nazwać skrót? A może coś, co zrobiłoby to automatycznie? Dzięki;)
Częściowa Służby musimy Test (obsługa błędów usunięte):
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;
}
...
W przypadku, gdy istnieje problem jest wtedy, gdy service.getData jest asynchroniczny obietnica zostanie rozwiązany ale funkcja dołączone do tej obietnicy z kodu testowego nie jest wywoływana, ponieważ root. $ digest już został wywołany. Nadzieję, że to daje więcej informacji
Obejście
var interval;
beforeEach(inject(function ($rootScope)
{
if(!interval)
{
interval = function()
{
$rootScope.$digest();
};
window.setInterval(interval, /*timing*/);
}
}));
skończyło się za pomocą obejścia powyżej zadzwonić do likwidacji wielokrotnie więc każda warstwa obietnicy będzie miał okazję do uruchomienia ... jej nie jest idealny i dość ale to działa w teście ...
Czy szyderczy swoje usługi i dlatego zwrócony obietnicy? – CainBot
Nie Próbowałem przetestować rzeczywistą usługę. – BrendanM
Jeśli testujesz rzeczywistą usługę i wewnętrznie używasz usługi $ http, to sądzę, że skrócone zostanie połączenie przez angularjs, gdy zdalne wywołanie się powiedzie lub się nie powiedzie. – CainBot