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?
Haben Sie versucht, auf Problem zu starten? Vielleicht ist es ein Fehler und Sie haben einen sehr einfachen Weg entwickelt, ihn zu reproduzieren. – atoth