3

使用 Emberfire (Firebase) 适配器时,我收到各种错误,表明测试没有等待数据操作完成。

例如:Error: Assertion Failed: You can only unload a record which is not inFlight.当我尝试创建、检查然后删除记录时

还:

FIREBASE WARNING: Exception was thrown by user callback. Error: Called stop() outside of a test context at Object.extend.stop (http://localhost:4200/assets/test-support.js:3000:10) at exports.default._emberTestingAdaptersAdapter.default.extend.asyncStart

这些错误不会在手动浏览我的应用程序时发生,也不会在使用标准 ember 数据适配器时发生。

是什么导致了这些错误,我该如何避免它们?

编辑:虽然症状有点不同(没有抛出错误),但听起来这个问题可能与我看到的错误有相同的根本原因。

4

1 回答 1

3

tl;博士

为了解决这个问题,我一直在使用自定义测试服务员。您可以安装它ember install ember-cli-test-model-waiter(与 Ember v2.0+ 一起使用)

更长的答案:

这些问题的根本原因是 ember 测试系统不知道如何处理 Firebase 的异步性。对于大多数适配器,这不是问题,因为测试系统会检测 AJAX 调用确保它们在继续之前完成,但这不适用于 Firebase 的 websockets 通信。

因此,尽管在手动交互时不会发生这些错误,但我相信如果可以足够快地单击,它们在技术上是可以的。

已知这些问题会发生在 ember-pouch 中,并且可能也会发生在其他非 AJAX 适配器(例如 localstorage 适配器 ( 1 , 2 ) 或任何其他基于 websockets 的适配器上。它可能会发生在夹具适配器上,但是可能会立即返回结果,因此不会触发此问题)。它也发生在其他异步过程中,例如液体火焰动画以类似方式修复

我在 tl;dr 中提到的自定义测试服务员的工作原理是等待所有模型在继续测试之前解决,因此应该与所有这些非 AJAX 适配器一起使用。

有关 ember 测试如何处理后台异步性的更多背景信息,Cory Forsyth 有一篇有用的博客文章这个要点提供了另一种更灵活的解决方案方法,但需要更多的手动簿记。

于 2015-10-29T23:16:52.810 回答