首页 > 解决方案 > 为什么我的 firebase 模拟器 get-call 承诺无法在开玩笑的单元测试中解决

问题描述

现在,当在浏览器中从我的 react 应用程序调用 firestore set() 和 get() 函数时,一切正常。但是当对这些相同的调用进行单元测试时,只有 set() 承诺会解决。get() 承诺永远不会解决(“超过 5000 毫秒的测试超时。[我测试超时 > 100000000])模拟器接收到 get() 请求没有任何问题。(它被记录在模拟器的请求选项卡中)

这是一个简单的测试,可以隔离我的问题。

import { firestore } from '../firebase';

it('Gets from Firestore', async () => {
  try {
    await firestore.collection("users").doc("testUser").set({ name: "Frank" })
    await firestore.collection("users").doc("testUser").get()
    expect(1).toBe(1);
  } catch (err) {
    console.log(err)
  }
})

Firestore 初始化(不包括凭据):

import firebase from "firebase/app";

import 'firebase/firestore';
import 'firebase/auth';

const firebaseConfig = {
    apiKey: "",
    authDomain: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: "",
    measurementId: ""
  };
  
firebase.initializeApp(firebaseConfig);
const firestore = firebase.firestore();
if (window.location.hostname === "localhost") {
  firestore.useEmulator("localhost", 8080);
}
export {firestore}
export default firebase;

标签: reactjsfirebaseunit-testinggoogle-cloud-firestorepromise

解决方案


在角度应用程序中,我遇到了相同的超时错误。似乎测试环境设置不正确,并且缺少一些 polyfill。

我通过在 *.spec 文件的顶部包含以下内容解决了这个问题

import 'core-js';

我还有另一个问题,Angular JIT 会在测试堆栈中的某些包含的模块/组件上失败,我通过将其包含在同一个 *.spec 文件中解决了这个问题

import "@angular/compiler";

老问题,但希望这对我未来有所帮助。


推荐阅读