首页 文章

单元测试使用firebase的聚合物网组件

提问于
浏览
1

我一直在尝试为使用最新版本的Firebase分布式数据库的聚合物Web组件配置离线单元测试 . 我的一些测试正在通过,但其他的 - 与传递的几乎完全相同 - 都没有正常运行 .

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

样品:https://github.com/doctor-g/wct-firebase-demo

在该项目中,有两套测试工作正常 . 最简单的是offline-test,它不能使用firebase数据库的离线模式来运行某些单元测试 . 这个技巧的核心是下面显示的 suiteSetup 方法 - 我从nfarina's work on 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);
  }

此方法的测试是_2822657中的唯一测试:

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 中的't happen with the same test structure described above that' .

那个's where I'被卡住了 . 为什么 offline-testwct-firebase-demo-app_test 套件工作正常,但我在 x-element_test 中收到此API密钥错误?我唯一的另一个线索是,如果我将有效的API密钥复制到我的 initializeApp 配置中,那么我会得到一个测试超时 .

更新:

这是运行测试时我的控制台日志的(补丁)图像:

Console log showing the failing test

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

Console log showing passing tests

1 回答

  • 0

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

    enter image description here

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

    注释除 offline firebase is ok 之外的所有测试显示仍然发生错误,该错误指向 suiteSetup() . 通过注释在设置的3次功能调用2下进一步缩小的问题,我们会看到错误是由调用引起 firebase.initializeApp() (并没有必然的关系 once() 你产生了怀疑) .

    需要考虑的一个解决方法是将Firebase库包装在类/接口中,并模拟单元测试 .

相关问题