【问题标题】:How to write unit and/or integration tests for an angular app that uses PouchDB如何为使用 PouchDB 的 Angular 应用程序编写单元和/或集成测试
【发布时间】:2018-09-01 06:41:06
【问题描述】:

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

我们希望将尽可能多的测试迁移到单元测试和/或集成测试。我们有一个有效的 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。

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

【问题讨论】:

  • 与任何第三方 API 相同。嘲笑它。 *.com/questions/22591994/… 的可能重复项
  • 对于正确的单元测试:模拟。对于集成测试,您可以轻松初始化 pouchdb,并使用本地(即文件系统支持)数据库运行它以进行测试。
  • 谢谢@Flimzy。我知道模拟单元测试,但我主要对集成测试感兴趣。我已经初始化了 pouchdb,但不确定如何使用它返回的承诺。

标签: angularjs unit-testing integration-testing karma-jasmine pouchdb


【解决方案1】:

为 PouchDB 编写集成测试是完全可能的,但需要做一些事情才能使其正常工作。一是你需要确保你可以从正在运行的业力进程中成功连接到你的 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 中运行的代码连接到您的 CouchDB 服务器,您可能需要运行 add-cors-to-couchdb 并添加对非标准 x-pouchdb 请求标头的支持。请注意,以下是适用于开发目的的简单单节点 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"'

【讨论】:

    最近更新 更多