【发布时间】:2016-07-29 15:56:25
【问题描述】:
我有这项服务:
angular.module('domeeApp')
.factory('streamWidget', streamWidgetFactory);
function streamWidgetFactory($q) {
return {
loadContent: function() {
return $q(function(resolve, reject) {
resolve('test');
})
}
}
}
我正在用 karma/mocha/chai 测试它:
describe('streamWidget', function() {
beforeEach(module('domeeApp'));
var streamWidget;
var $timeout;
beforeEach(inject(function(_$timeout_, _streamWidget_) {
streamWidget = _streamWidget_;
$timeout = _$timeout_;
}));
it('should load new content', function(done) {
streamWidget.loadContent()
.then(function(res) {
expect(res).to.equal('test');
done();
})
.catch(function(){})
$timeout.flush();
});
});
由于 $q 承诺不适用于 mocha,我正在关注 this answer,它表示要添加 $timeout.flush() 以强制执行承诺的 .then 方法。
问题是,在调用 .flush() 之后,我的所有应用都被唤醒了,我开始从 angular-mocks 中得到这个错误:
Error: Unexpected request: GET /partials/page/view/index.
我知道 $httpBackend,但如果要模拟我的应用在启动时发出的所有请求,那将是疯狂。
有没有办法让 $q 承诺与 mocha 一起工作,而无需调用 $timeout.flush() 或 $rootScope.$apply()?
【问题讨论】:
-
问题的主题是 Chai,而不是 Mocha。 stackoverflow.com/a/37374041/3731501 的可能重复项
-
问题的主题是 $q 服务以及如何在不使用 apply/flush 的情况下强制解决 $q 承诺。 Chai 与它无关,因为我没有使用 chai-as-promised。至少,我是这么看情况的,如果你不同意,试着解释得更好。
-
是 Chai 做断言,而不是 Mocha。那么,你可以考虑使用 chai-as-promised,这是 $q 承诺断言的方式,无需在
then之后调用$apply()或$digest()。 -
我尝试使用 chai-as-promised,但结果相同。如果你能告诉我一个可行的解决方案,我会接受你的回答。
-
是的,
chai-as-promised需要一些额外的设置,如上面的链接所示。幸运的是,它有transferPromiseness钩子来为断言的承诺提供所需的行为(即运行一个摘要来执行整个承诺链)。
标签: angularjs mocha.js angular-promise chai karma-mocha