我正试图对外部承诺的解决/拒绝进行单元测试。
问题是,当注入ngMock
模块时,这些承诺永远不会完成 - 这是强制性的,因为我正在触发HTTP请求和超时。
以angular-pouchdb为例,这是我项目的依赖项。从v2.0.0开始,因为PouchDB promises are used,当注入ngMock 时,测试不再完成。
示例代码,改编自angular-pouchdb tests:
var scope;
beforeEach(function() {
var $injector = angular.injector(['ng', 'ngMock', 'pouchdb']);
var pouchDB = $injector.get('pouchDB');
scope = $injector.get('$rootScope');
db = pouchDB('db');
});
it('should wrap destroy', function(done) {
db.destroy()
.then(shouldBeOK)
.catch(shouldNotBeCalled)
.finally(done);
// No matter what's used ($apply, $applySync, $timeout.flush, etc) -- the tests will never finish.
scope.$apply();
});
上述测试的日志如下:
C:\Users\Gustavo\Projetos\main\angular-pouchdb (master)
λ karma start
INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.8 (Windows 8 0.0.0)]: Connected on socket s1A7jIzmtcOxkGCtzYke with id 42899233
PhantomJS 1.9.8 (Windows 8 0.0.0) Angular-aware PouchDB public API should wrap destroy FAILED
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
所以,我的问题归结为:单元测试Angular有什么我缺少的吗?或者它是ngMock中的内部错误?
<子> This issue has been created in the angular-pouchdb repository as well 子>
答案 0 :(得分:0)
编辑8/25:所以我们实际上已经解决了这个问题,但我仍然在研究是什么导致了这个问题。我会在几天内写一篇更新的文章。
好的,在我的业余时间遇到这个问题好几天后,我已经把它缩小到pouchDB的第三方承诺中的某种异常失败,它在10秒超时并且没有抛出干净错误回来。我可以通过更新我的
来获得这个ProjectModel
如果我重新调整并调整自定义构建并将一些日志记录放入pouchDB,我可以确认承诺没有在那里正确返回,我已经能够在3.6和4.0 pouchDB中复制它。从我的包装控制台日志中,通话中没有任何内容来自包装的呼叫。在测试3的周围,我得到了409个未被捕获的错误,因此很明显pouchDB中没有正确处理这些错误。
这是一个没有启用ngMock的示例,因此您可以看到没有它的距离。
答案 1 :(得分:-1)
我认为这不是ngMock问题,但我认为这是因为PhantomJS尚未准备好支持PouchDB。
https://github.com/ariya/phantomjs/issues/10992
https://github.com/pouchdb/pouchdb/blob/c55db55d7edbf0821538e027399536c260af5876/docs/adapters.md