你如何使用 Jest 模拟 Firebase Firestore 方法?

新手上路,请多包涵

我有一系列功能,每个功能都执行各种 firestore 交互。我如何使用 Jest 模拟这些 firestore 调用?我想避免使用图书馆。

当我使用 jest.mock("firebase/app")jest.mock("firebase/firestore") 和其他变体时,我要么得到 null TypeErrors,要么错误表明我仍在引用实际导入而不是模拟: Error: ... make sure you call initializeApp() .

例如,我要测试的一个简单功能:

 import firebase from "firebase/app";
import "firebase/firestore";

export const setDocData = (id, data) => {
  const newDoc = {
    created: firebase.firestore.FieldValue.serverTimestamp(),
    ...data
  };
  firebase
    .firestore()
    .doc("docs/" + id)
    .set(newDoc);
};

注意 firebase 是如何像往常一样导入的,然后 firestore 是作为副作用导入的。另请注意 firestore 是如何首先作为函数调用,然后作为属性引用的。我相信这是我麻烦的根源。

原文由 Brendan McGill 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 329
1 个回答

这是我找到的解决方案。网上关于这方面的资料不多,希望对大家有所帮助。

编辑:我相信你可以使用 /__MOCKS__/ 文件夹系统做类似的事情,而不是像我在这个例子中那样覆盖 firestore 对象。

诀窍是创建模拟函数的链式 API,并将其设置在 firebase 对象上,而不是导入和模拟 firestore。下面的示例允许我测试上面的示例函数,以及 doc().get() promises。

 const docData = { data: "MOCK_DATA" };
const docResult = {
  // simulate firestore get doc.data() function
  data: () => docData
};
const get = jest.fn(() => Promise.resolve(docResult));
const set = jest.fn();
const doc = jest.fn(() => {
  return {
    set,
    get
  };
});
const firestore = () => {
  return { doc };
};
firestore.FieldValue = {
  serverTimestamp: () => {
    return "MOCK_TIME";
  }
};

export { firestore };

我在所有测试执行之前运行的文件中声明它(请参阅文档),然后在我的测试文件中导入并使用它,如下所示:

 import firebase from "firebase/app";
import { firestore } from "../setupTests";
firebase.firestore = firestore;

describe("setDocData", () => {
  const mockData = { fake: "data" };
  beforeEach(() => {
    jest.clearAllMocks();
    setDocData("fakeDocID", mockData);
  });

  it("writes the correct doc", () => {
    expect(firestore().doc).toHaveBeenCalledWith("docs/fakeDocID");
  });

  it("adds a timestamp, and writes it to the doc", () => {
    expect(firestore().doc().set).toHaveBeenCalledWith({
      created: "MOCK_TIME",
      fake: "data"
    });
  });
});

原文由 Brendan McGill 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题