Ember/Emberfire + Firebase 3 验收测试
Ember/Emberfire + Firebase 3 Acceptance Test
在更新 firebase 3 之前,我们的验收测试 运行 没有任何问题。我们在 beforeTest 和 afterTest
中使用以下内容
moduleForAcceptance('Acceptance | Dashboard | Items | Library | New', {
beforeEach() {
stubFirebase();
var ref = createOfflineRef(basicDataRef, 'https://MY-APP.firebaseio.com');
replaceAppRef(this.application, ref);
stubValidSession(this.application, {uid: 'xxxx'});
},
afterEach() {
unstubFirebase();
}
});
basicDataRef 是测试的夹具。上面的代码允许我在 torii 库中的测试助手之后模拟会话,以允许我的应用程序正确获取所需的数据,因为我的 firebase 层次结构如下:
/
+--uid
+--个人资料
+--其他数据
我没有测试权限规则,只是与应用程序中的 save/edit 数据进行交互,这在 firebase 3 迁移之前工作正常。在版本 3 之后,我的所有测试 returns 如下:
actual: >
false
expected: >
true
stack: >
at http://localhost:7357/assets/test-support.js:4130:12
at exports.default._emberTestingAdaptersAdapter.default.extend.exception (http://localhost:7357/assets/vendor.js:49473:7)
at onerrorDefault (http://localhost:7357/assets/vendor.js:41461:24)
at Object.exports.default.trigger (http://localhost:7357/assets/vendor.js:62212:11)
at http://localhost:7357/assets/vendor.js:63463:40
at Queue.invoke (http://localhost:7357/assets/vendor.js:10415:16)
message: >
Error: permission_denied at /xxxx/profile: Client doesn't have permission to access the desired data.
我一直认为 emberfire 中的 createOfflineRef 允许我们绕过规则检查。它不断返回 permission_denied 的事实非常令人费解。也许我需要重新设计测试?或者我一直错误地处理这个问题?非常感谢任何输入
深入了解这个问题,我想我会回答我自己的问题,以防其他人遇到与我相同的问题。
新的 firebase InitializeApp method has an additional optional parameter called name. By default, Emberfire service 将此名称设置为:
export const DEFAULT_NAME = '[EmberFire default app]';
然而,Emberfire test helper 创建 firebase 离线引用将具有不同实例名称的 firebase 实例存根为:
export const DEFAULT_NAME = '[EmberFire offline test app]';
这导致我的测试失败 permission denied,因为验收测试正在尝试连接到“[EmberFire default app]”并且存根的离线引用被称为某物否则。
创建我自己的 create-offline-ref 助手,将 DEFAULT_NAME 替换为“[EmberFire default app]”即可解决问题。我不确定什么是验收测试的最佳实践,因为更改似乎是故意在 emberfire 上进行的。
在更新 firebase 3 之前,我们的验收测试 运行 没有任何问题。我们在 beforeTest 和 afterTest
中使用以下内容moduleForAcceptance('Acceptance | Dashboard | Items | Library | New', {
beforeEach() {
stubFirebase();
var ref = createOfflineRef(basicDataRef, 'https://MY-APP.firebaseio.com');
replaceAppRef(this.application, ref);
stubValidSession(this.application, {uid: 'xxxx'});
},
afterEach() {
unstubFirebase();
}
});
basicDataRef 是测试的夹具。上面的代码允许我在 torii 库中的测试助手之后模拟会话,以允许我的应用程序正确获取所需的数据,因为我的 firebase 层次结构如下: / +--uid +--个人资料 +--其他数据
我没有测试权限规则,只是与应用程序中的 save/edit 数据进行交互,这在 firebase 3 迁移之前工作正常。在版本 3 之后,我的所有测试 returns 如下:
actual: >
false
expected: >
true
stack: >
at http://localhost:7357/assets/test-support.js:4130:12
at exports.default._emberTestingAdaptersAdapter.default.extend.exception (http://localhost:7357/assets/vendor.js:49473:7)
at onerrorDefault (http://localhost:7357/assets/vendor.js:41461:24)
at Object.exports.default.trigger (http://localhost:7357/assets/vendor.js:62212:11)
at http://localhost:7357/assets/vendor.js:63463:40
at Queue.invoke (http://localhost:7357/assets/vendor.js:10415:16)
message: >
Error: permission_denied at /xxxx/profile: Client doesn't have permission to access the desired data.
我一直认为 emberfire 中的 createOfflineRef 允许我们绕过规则检查。它不断返回 permission_denied 的事实非常令人费解。也许我需要重新设计测试?或者我一直错误地处理这个问题?非常感谢任何输入
深入了解这个问题,我想我会回答我自己的问题,以防其他人遇到与我相同的问题。
新的 firebase InitializeApp method has an additional optional parameter called name. By default, Emberfire service 将此名称设置为:
export const DEFAULT_NAME = '[EmberFire default app]';
然而,Emberfire test helper 创建 firebase 离线引用将具有不同实例名称的 firebase 实例存根为:
export const DEFAULT_NAME = '[EmberFire offline test app]';
这导致我的测试失败 permission denied,因为验收测试正在尝试连接到“[EmberFire default app]”并且存根的离线引用被称为某物否则。
创建我自己的 create-offline-ref 助手,将 DEFAULT_NAME 替换为“[EmberFire default app]”即可解决问题。我不确定什么是验收测试的最佳实践,因为更改似乎是故意在 emberfire 上进行的。