2015-11-27 6 views
7

Ich habe ein Problem, wo mein Code ES6 Promises mit Winkelversprechen mischt, und es funktioniert in der Produktion, indem ich Unit Tests nicht schreiben kann, die bestehen.

Dieser Code-Schnipsel zwei Instanzen zeigt, wo Jasmine Unit-Tests fehlschlagen, aber der Code arbeitet in der Produktion fein:

// An angular $q promise 
    var f1 = function() { 
    return $q(function(resolve, reject) { 
     resolve('This is function 1!'); 
    }); 
    } 

    // An ES6 promise 
    var f2 = function() { 
    return new Promise(function(resolve, reject) { 
     resolve('This is function 2!'); 
    }); 
    } 

    // An angular $q.all() promise, attempting to resolve a $q and ES6 promise. 
    var s1 = function() { 
    return $q.all([f1(), f2()]).then(function() { 
     return '$q resolved both promises!' 
    }); 
    } 

    // An ES6 promise attempting to resolve a $q and an ES6 promise. 
    var s2 = function() { 
    return Promise.all([f1(), f2()]).then(function() { 
     return 'ES6 resolved both promises!' 
    }); 
    } 

Die Tests wie folgt aussehen:

describe('Testing mixed ES6 promises and Angular $q', function() { 
    var $scope = null; 
    var service = null; 

    //you need to indicate your module in a test 
    beforeEach(module('plunker')); 

    beforeEach(inject(function($rootScope, _testService_) { 
    $scope = $rootScope.$new(); 
    service = _testService_; 
    })); 

    afterEach(function() { 
    }); 

    it('should resolve f1', function(done) { 
    var t1 = service.f1(); 
    t1.then(function() { 
     done(); 
    }); 
    $scope.$apply(); 
    }); 

    it('should resolve f2', function(done) { 
    var t1 = service.f1(); 
    t1.then(function() { 
     done(); 
    }); 
    $scope.$apply(); 
    }); 

    it('should resolve s1', function(done) { 
    var t1 = service.s1(); 
    t1.then(function() { 
     done(); 
    }); 
    $scope.$apply(); 
    }); 

    it('should resolve s2', function(done) { 
    var t1 = service.s2(); 
    t1.then(function() { 
     done(); 
    }); 
    $scope.$apply(); 
    }); 

}); 

Diese Plunker hat eine Arbeits Demonstration : http://plnkr.co/edit/xhRc7O

Beachten Sie, dass die ersten 2 Tests bestehen, weil sie einfach ES6 oder $ q promi sind ses.

Dann beachten Sie, dass alle anderen Tests fehlschlagen, weil ich ES6 und $ q Versprechen auf verschiedene Arten mischt.

Schließlich, dass in der Steuerung zu zeigen, dass zwei FAILING-Tests tatsächlich in der Produktion arbeiten.

Warum lässt mich Angular nicht ES6 mischen und $ q verspricht in meinen Tests, noch keine Probleme im Produktionscode?

+0

Haben Sie versucht, auf Problem zu starten? Vielleicht ist es ein Fehler und Sie haben einen sehr einfachen Weg entwickelt, ihn zu reproduzieren. – atoth

Antwort

1

Ich lief auch auf dieses Problem mit meinen Komponententests. Bis ich eine Erklärung zu dem Problem und eine ordnungsgemäße Lösung habe, verwende ich eine Problemumgehung:

if (window.Promise !== $q) { 
     window.Promise = $q; 
    } 
+0

Dies funktionierte für mich, aber ich habe dieses Problem auf Jasmine in der Hoffnung, dass sie eine richtige Lösung erstellen werden: https://github.com/jasmine/jasmine/issues/1200 – yukw777

+0

@ yukw777 Vergessen Sie nicht, es wiederherzustellen der ursprüngliche Wert in afterEach-Funktion. Andernfalls können andere Tests fehlschlagen, weil $ q in einem anderen Winkelkontext erstellt wird. – Eduard