无法使用cypress通过使用Firestore本地模拟器来测试应用程序

时间:2019-12-14 15:53:03

标签: firebase google-cloud-firestore cypress webapp2 firebase-tools

我有一个使用vue和firebase / firestore构建的应用程序。我使用firebase模拟器进行本地开发,并试图将我的开发工作流程与cypress集成。但是我在cypress中遇到了一个错误,如果我从浏览器访问该应用程序就不会发生。

Firebase CLI版本是7.9.0,赛普拉斯版本是“ ^ 3.8.0”

我用于加载所有内容的npm脚本如下:

"start": "firebase emulators:exec --only firestore \"npm run dev:appandtest\"",
"dev:appandtest": "concurrently -n \"app,test\" -c \"bgYellow.black,bgWhite.black\" \"npm:dev:app\" \"npm:dev:test\"",
"dev:app": "webpack-dev-server --config build/webpack.dev.js",
"dev:test": "npx cypress open", 

本地服务器在端口9000上运行,firebase仿真器在端口8080上运行。

运行后,如果从正常浏览器访问应用程序,则此屏幕显示一切正常。

普通

enter image description here

然后我尝试使用此代码运行基本的赛普拉斯测试

    describe('The Home Page', function () {
      it('successfully loads', function () {
        cy.visit('/');
      });
    });

我收到以下错误消息:

    [2019-12-14T15:29:24.725Z]  @firebase/firestore: Firestore (6.6.2): Could not reach Cloud Firestore backend. Backend didn't respond within 10 seconds.
    This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.

    error.ts:166 Uncaught (in promise) FirebaseError: Failed to get document because the client is offline.
        at new FirestoreError (http://localhost:9000/bundle.js:11739:149)
        at Object.next (http://localhost:9000/bundle.js:16734:8)
        at next (http://localhost:9000/bundle.js:16725:4704)
        at http://localhost:9000/bundle.js:16430:411

我还拍摄了一个屏幕截图: 越野车

enter image description here

我尝试研究答案,但没有能力。感谢您的任何提前帮助。

1 个答案:

答案 0 :(得分:3)

至少到现在,解决此问题的方法是启用experimentalForceLongPolling,如下所示:

// NOTE: do NOT put this in production.
firebase.firestore().settings({ experimentalForceLongPolling: true })

重要提示:这是一项实验功能,您应该使用环境变量对它进行一些条件检查。您不应该在生产环境中使用它。

对此的原因进行了最好的描述here

Firestore Web SDK的默认行为是利用WebChannel的流模式。客户端使它看起来像XHR,但是服务器将使响应保持打开状态60秒钟,并在该时间段内发送尽可能多的服务器启动的响应。

experimentalForLongPolling选项会强制服务器每个请求仅发送一个响应。

还有here

这与我们在赛普拉斯中使用的解决方法相同。我认为潜在的问题是赛普拉斯正在拦截所有网络流量,因此它可以监视甚至是模拟。但是,firestore使用的网络通道协议对同一个http请求有多个答复。赛普拉斯代码无法处理此问题,只会转发第一个答复,而忽略其余答复。