混合$q和ES6时测试Angular承诺
Testing Angular when mixing $q and ES6 promises
我遇到了一个问题,我的代码将ES6-Promises与Angular Promises混合在一起,并且它在生产中工作,因为我无法编写通过的单元测试。
这个代码片段演示了Jasmine单元测试将失败,但代码在生产中运行良好的两个实例:
// 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!'
});
}
测试看起来像:
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();
});
});
这个Plunker有一个工作演示:http://plnkr.co/edit/xhRc7O
请注意,前两个测试通过了,因为它们是简单的ES6或$q承诺。
然后注意到,其他所有测试都失败了,因为我以不同的方式混合了ES6和$q承诺。
最后,请注意,在控制器中,我演示了两个FAILING测试在生产中确实有效。
为什么Angular不让我在测试中混合ES6和$q承诺,但在生产代码中却没有问题?
我在单元测试中也遇到了这个问题。在我对这个问题做出解释并找到合适的解决方案之前,我会使用一个变通方法:
if (window.Promise !== $q) {
window.Promise = $q;
}
相关文章:
- 测试Angular Service解决错误回调中的promise
- 单元测试Angular自举代码
- 测试angular js指令
- 测试angular服务内部方法调用
- 如何使用业力和ng-scenario测试Angular/Umbraco混合应用程序
- 设置 Jasmine & Karma 来测试 Angular
- Karma 单元测试 Angular JS 指令与 externalUrl
- 如何使用Jasmine测试Angular Factory对象
- 单元测试Angular+Browserify+Gulp和Jasmine
- 测试Angular.js控制器,而不使用Jasmine嘲笑工厂
- 如何使用一个函数测试Angular控制器,该函数可以在不嘲笑AJAX调用的情况下进行AJAX调用
- 混合$q和ES6时测试Angular承诺
- 用Gulp摩卡测试Angular:“;窗口未定义”;
- 使用Kendo Grid/Datasource的单元测试Angular Controller
- 如何在e2e测试Angular Protractor的标签中添加文本
- 用Jasmine单元测试测试Angular模块
- 如何在指令link函数中单元测试Angular的routechangessuccess
- 测试Angular的$emit和$on事件
- Karma/Jasmine用控制器模块测试Angular
- 单元测试angular引导模态服务