Attualmente stiamo provando a testare i nostri servizi angolari che utilizzano le promesse per restituire valori ai controller. Il problema è che le funzioni che assegniamo al .then non vengono chiamate in Jasmine.
Abbiamo rilevato che l'aggiunta di $ rootScope.digest() alla funzione dopo che la promessa viene restituita consente di chiamare le promesse sincrone, tuttavia non funziona ancora per le promesse asincrone.
Il codice finora è
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();
});
In questo caso la promessa viene chiamato bene ma se è asincrono non sarà chiamato perché la promessa non è pronto per "digestione" dal tempo di radice. $ digest() è chiamato.
C'è un modo per dire quando una promessa è dopo essere stata risolta in modo che io possa chiamare digest? O forse qualcosa che lo farebbe automaticamente? Grazie;)
parziale del Servizio dobbiamo testare (gestione degli errori rimosso):
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;
}
...
Nel caso in cui ci sia un problema è quando service.getData è asincrona la promessa viene risolto ma la funzione attaccato a quella promessa dal codice di prova non viene chiamato perché la radice. $ digest è già stato chiamato. Spero che questo dà più informazioni
Soluzione
var interval;
beforeEach(inject(function ($rootScope)
{
if(!interval)
{
interval = function()
{
$rootScope.$digest();
};
window.setInterval(interval, /*timing*/);
}
}));
ho finito per usare la soluzione precedente per chiamare ripetutamente il digest così ogni strato della promessa avrebbe avuto la possibilità di correre ... non il suo ideale o abbastanza ma funziona per il test ...
State beffardo il vostro servizio e quindi la promessa tornato? – CainBot
No Stavo cercando di testare il servizio effettivo. – BrendanM
Se si sta testando il servizio effettivo e si sta utilizzando internamente il servizio $ http, credo che un digest verrà avviato da angularjs quando la chiamata remota ha esito positivo o negativo. – CainBot