我有一系列功能,每个功能都执行各种 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 许可协议
这是我找到的解决方案。网上关于这方面的资料不多,希望对大家有所帮助。
诀窍是创建模拟函数的链式 API,并将其设置在 firebase 对象上,而不是导入和模拟 firestore。下面的示例允许我测试上面的示例函数,以及
doc().get()
promises。我在所有测试执行之前运行的文件中声明它(请参阅文档),然后在我的测试文件中导入并使用它,如下所示: