Se mettre “$digest déjà en cours” dans async test avec le Jasmin 2.0

Je sais que l'appel $digest ou $apply manuellement pendant un condensé cycle de provoquer un "$digest déjà en cours" erreur, mais je n'ai aucune idée de pourquoi je suis ici.

C'est un test unitaire pour un service qui intègre $http, le service est assez simple, il empêche de prise de dupliquer des appels vers le serveur tout en s'assurant que le code qui tente de faire les appels obtient toujours les données attendues.

angular.module('services')
    .factory('httpService', ['$http', function($http) {

        var pendingCalls = {};

        var createKey = function(url, data, method) {
            return method + url + JSON.stringify(data);
        };

        var send = function(url, data, method) {
            var key = createKey(url, data, method);
            if (pendingCalls[key]) {
                return pendingCalls[key];
            }
            var promise = $http({
                method: method,
                url: url,
                data: data
            });
            pendingCalls[key] = promise;
            promise.then(function() {
                delete pendingCalls[key];
            });
            return promise;
        };

        return {
            post: function(url, data) {
                return send(url, data, 'POST');
            },
            get: function(url, data) {
                return send(url, data, 'GET');
            },
            _delete: function(url, data) {
                return send(url, data, 'DELETE');
            }
        };
    }]);

L'unité de test est également assez simple, il utilise $httpBackend d'attendre la demande.

it('does GET requests', function(done) {
    $httpBackend.expectGET('/some/random/url').respond('The response');

    service.get('/some/random/url').then(function(result) {
        expect(result.data).toEqual('The response');
        done();
    });
    $httpBackend.flush();
});

Ce souffle que sone comme done() est appelée avec un "$digest déjà en cours d'erreur". Je n'ai aucune idée pourquoi. Je peux résoudre ce problème en emballage done() dans un délai d'expiration comme ce

setTimeout(function() { done() }, 1);

Qui signifie done() obtiendrez en file d'attente et de courir après le $digest est fait mais tout cela résout mon problème, je veux savoir

  • Pourquoi est-Angulaire dans un condensé du cycle en premier lieu?
  • Pourquoi appeler done() déclencher cette erreur?

J'ai eu exactement le même test de course vert au Jasmin 1.3, cela s'est produit seulement après que j'ai mis à Jasmine 2.0 et réécrit le test à utiliser le nouveau asynchrone de syntaxe.

  • qu'est-ce que done()?
  • C'est la nouvelle façon de traiter avec async tests de Jasmin 2.0. Il est injecté dans le test-fonction et si vous n'avez pas appelé dans les 5 secondes, le test échoue. Voir le jasmin.github.io/2.0/...
  • Il n'y a pas de balise pour jasmine 2.0, ou je l'aurais marqué. Je peux voir comment la syntaxe est source de confusion si vous ne l'avez pas vu avant.
  • OK, j'ai passé presque toute la journée hier, mais je pense que j'ai tout compris. Je vais l'ajouter comme une réponse, et j'ai peut-être tort.
  • que ça ressemble à une belle recherche, je vais voir si je confirme ce que vous avez trouvé.
  • s'il vous plaît ne, et après ce que vous trouvez.
  • Je vois la même chose que vous voyez. Bon travail de creuser dans ce.
  • Heureux que j'ai trouvé cela, mais triste que tout le monde est probablement de passer un jour sur ce

InformationsquelleAutor ivarni | 2014-06-21