如何为使用 PouchDB 的 angular 应用编写单元 and/or 集成测试

How to write unit and/or integration tests for an angular app that uses PouchDB

我正在使用大型 AngularJS + PouchDB 代码库。我们正在使用 Protractor 进行端到端测试,但我们发现自己过于依赖端到端测试。这些很慢,而且经常间歇性地失败。

我们希望将尽可能多的测试迁移到单元测试 and/or 集成测试。我们有一个有效的 karma-jasmine 设置,我们用它来测试一些不与数据库交互的代码。我们想使用 Karma 来测试与数据库交互的代码,但不确定执行此操作的最佳方法。

这是一个例子:

"use strict";

var FooService;

describe('The FooService', function () {
  beforeEach(function () {
    angular.mock.module('myApp');
  });

  beforeEach(angular.mock.inject(function (_FooService_) {
     FooService = _FooService_;
  }));

  it('should be able to return all bars', function() {
    let bars = FooService.getBars();
  });
});

这失败了,因为 FooService.getBars() 方法调用了尚未初始化的 PouchDB。

你有类似的代码库和使用单元 and/or 集成测试吗?如果有,您是如何解决这个问题的?

为 PouchDB 编写集成测试是完全可能的,但需要做一些事情才能使其正常工作。一是您需要确保可以从 运行ning karma 进程中成功连接到您的 PouchDB 服务器,其余的由此示例代码捕获。

it('should be able to successfully make a PouchDB request', (done) => {
  jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
  let interval = 20;

  let timeoutId = setInterval(() => {
    $rootScope.$digest();
  }, interval);

  let promise = MyService.methodThatCallsPouchDB();

  result.then((results) => {
    // expectations
  }).finally(done);
});

如果您无法从 karma 内的代码 运行ning 连接到您的 CouchDB 服务器,您可能需要 运行 add-cors-to-couchdb 并添加对 non-standard x-pouchdb 请求 header。请注意,以下是适合开发目的的简单 single-node CouchDB 配置。

# Configure CouchDB to enable CORS
# If add-cors-to-couchdb is missing, install with npm install -g add-cors-to-couchdb
add-cors-to-couchdb http://localhost:5984 -u myAdminUser -p myAdminPassword

# Add non-standard x-pouchdb header not added by add-cors-to-couchdb
curl 'http://myAdminUser:myAdminPassword@localhost:5984/_node/nonode@nohost/_config/cors/headers' \
-X PUT \
-H 'Content-Type: application/json' \
--data-binary '"accept, authorization, content-type, origin, referer, x-csrf-token, x-pouchdb"'