我一直在尝试为使用最新版Firebase分布式数据库的聚合物网络组件配置离线单元测试。我的一些测试正在通过,但其他的 - 与传递的几乎完全相同 - 都没有正常运行。
我在github上设置了一个项目来演示我的配置,我将在下面提供更多评论。
样品: https://github.com/doctor-g/wct-firebase-demo
在该项目中,有两套测试工作正常。最简单的是offline-test
,它根本不使用Web组件。它只是表明可以使用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);
}
此方法的测试是its suite中唯一的测试:
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-test
和wct-firebase-demo-app_test
套件工作正常,但我在x-element_test
中遇到此API密钥错误?我唯一的另一个线索是,如果我将有效的API密钥复制到我的initializeApp
配置中,那么我会得到一个测试超时。
更新:
这是运行测试时我的控制台日志的(修补过的)图像。:
为了说明下面的tony19提出的问题,这里是pushData has an effect
中只有x-element_test
注释掉的控制台日志:
答案 0 :(得分:0)
... (Bar as) => ...
结果显然是误报。如果您检查Chrome控制台,offline-test
实际上会抛出相同的错误:
错误不会对测试结果产生任何影响,因为API密钥验证在测试完成后异步发生。如果你能以某种方式进入验证,你就能够在测试中发现错误。
评论除offline-test
之外的所有测试都会显示仍然发生的错误,该错误指向offline firebase is ok
。通过在设置中对3个函数调用中的2个进行评论来进一步缩小问题,我们会看到错误是由调用suiteSetup()
引起的(并且不一定与firebase.initializeApp()
相关怀疑)。
要考虑的一个解决方法是将Firebase库包装在类/接口中,并模拟单元测试。