3

我正在尝试对外部承诺的解决/拒绝进行单元测试。

问题是这些承诺在ngMock注入模块时永远不会完成 - 这是强制性的,因为我正在触发 HTTP 请求和超时。

angular-pouchdb 为例,它是我项目的依赖项。从 v2.0.0 开始,由于使用了 PouchDB 承诺,因此在注入 ngMock 时测试不再完成。

示例代码,改编自angular-pouchdb 测试

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 的内部错误?

这个问题也已在 angular-pouchdb 存储库中创建

4

2 回答 2

0

编辑 8/25:所以我们实际上已经解决了这个问题,但我仍在调查是什么原因造成的。几天后我会有更多更新的文章。

好吧,在我的业余时间遇到这个问题几天后,我已将其缩小为来自 pouchDB 的第 3 方承诺中的某种异常失败,其中它达到 10 秒超时并且没有抛出一个干净的错误。我可以通过更新我的

jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;

如果我返回并调整自定义构建并将一些登录信息登录到 pouchDB,我可以确认那里没有正确返回承诺,我已经能够在 3.6 和 4.0 pouchDB 中复制它。从我围绕呼叫的包装控制台日志中,包装呼叫没有任何结果。在测试 3 前后,我得到了未捕获的 409 错误,因此 pouchDB 中显然有一些东西没有被正确处理。

错误日志

这是一个未打开 ngMock 的示例,因此您可以看到没有它的情况。

没有 ngMock

于 2015-08-17T15:10:14.283 回答
-1

我不认为这是 ngMock 的问题,但我认为这是因为 PhantomJS 还没有准备好支持 PouchDB。

https://github.com/ariya/phantomjs/issues/10992

https://github.com/pouchdb/pouchdb/blob/c55db55d7edbf0821538e027399536c260af5876/docs/adapters.md

于 2015-08-20T05:33:42.847 回答