1

我一直在尝试为使用最新版本的 Firebase 分布式数据库的聚合物 Web 组件配置离线单元测试。我的一些测试通过了,但其他的——看起来与通过的测试几乎相同——运行不正常。

我在 github 上建立了一个项目来演示我的配置,我将在下面提供更多评论。

示例: https ://github.com/doctor-g/wct-firebase-demo

在那个项目中,有两套测试工作正常。最简单的是offline-test,它根本不使用 Web 组件。它只是表明可以使用 firebase 数据库的离线模式来运行一些单元测试。这个技巧的核心是suiteSetup下面显示的方法——我从nfarina 在 firebase-server 上的工作中学到的技巧。

suiteSetup(function() {
  app = firebase.initializeApp({
      apiKey: 'fake',
      authDomain: 'fake',
      databaseURL: 'https://fakeserver.firebaseio.com',
      storageBucket: 'fake'
  });
  db = app.database();

  db.goOffline();
});

所有测试offline-test通过。

下一个套件是wct-firebase-demo-app_test.html,它测试同名的 Web 组件。该套件包含一系列单元测试,这些测试设置类似offline-test并且通过了。遵循依赖注入的思想,wct-firebase-demo-app组件有一个database属性,将 firebase 数据库引用传递到该属性中,这用于进行所有 firebase 调用。这是套件中的一个示例:

  test('offline set string from web component attribute', function(done) {
    element.database = db;
    element.database.ref('foo').set('bar');
    element.database.ref('foo').once('value', function(snapshot) {
      assert.equal(snapshot.val(), 'bar');
      done();
    });
  });

我在组件中也有一些非常简单的方法,以尝试对我稍后将讨论的碎片进行三角测量。只要说这个测试通过就足够了:

test('offline push string from web component function', function(done) {
    element.database = db;
    let resultRef = element.pushIt('foo', 'bar');
    element.database.ref('foo').once('value', function(snapshot) {
      assert.equal(snapshot.val()[resultRef.key], 'bar');
      done();
    });
  });

并得到此实现的支持wct-firebase-demo-app

  pushIt: function(at, value) {
    return this.database.ref(at).push(value);
  },

再一次,这些都过去了。现在我们进入了真正的困境。有一套针对另一个元素的测试x-element,它有一个方法pushData

  pushData: function(at, data) {
    this.database.ref(at).push(data);
  }

此方法的测试是其套件中唯一的测试:

  test('pushData has an effect', function(done) {
    element.database = db;
    element.pushData('foo', 'xyz');
    db.ref('foo').once('value', function(snapshot) {
      expect(snapshot.val()).not.to.be.empty;
      done();
    });
  });

这个测试没有通过。在运行此测试时,控制台会显示一条错误消息:

    Your API key is invalid, please check you have copied it correctly.

通过设置一些断点并遍历执行,在我看来这个错误是在调用之后once但在触发回调之前出现的。再次注意,这不会发生在上述相同的测试结构中wct-firebase-demo-app

这就是我卡住的地方。为什么offline-testwct-firebase-demo-app_test套件工作正常,但我得到这个 API 密钥错误x-element_test?我唯一的其他线索是,如果我将有效的 API 密钥复制到我的initializeApp配置中,那么我会得到一个测试超时。

更新:

这是运行测试时我的控制台日志的(拼凑在一起的)图像。:

显示失败测试的控制台日志

为了说明下面 tony19 提出的问题,这里是控制台日志,只是pushData has an effect注释掉x-element_test了:

显示通过测试的控制台日志

4

1 回答 1

0

结果offline-test显然是误报。如果您检查 Chrome 控制台,offline-test实际上会引发相同的错误:

在此处输入图像描述

该错误很可能不会影响测试结果,因为 API 密钥验证是在测试完成后异步发生的。如果您能以某种方式挂钩该验证,您将能够在测试中发现错误。

注释掉所有测试,除了offline firebase is ok显示错误仍然发生,它指向suiteSetup(). 通过在设置中注释 3 个函数调用中的 2 个来进一步缩小问题范围,我们将看到错误是由调用引起的firebase.initializeApp()(不一定与once()您所怀疑的有关)。

要考虑的一种解决方法是将 Firebase 库包装在一个类/接口中,并对其进行模拟以进行单元测试。

于 2016-05-29T21:31:02.553 回答