У меня есть функция для обработки подключения к Cloud Firestore через Admin SDK. Я знаю, что функция работает нормально, так как приложение подключается и позволяет записывать в базу данных.
Теперь я пытаюсь протестировать эту функцию с помощью Jest. Чтобы избежать тестирования, выходящего за рамки этой функции, я высмеиваю модуль узла firebase-admin. Однако мой тест не проходит с ошибкой «TypeError: admin.firestore не является функцией».
Моя функция и тесты написаны на TypeScript, запускаются через ts-jest, но я не думаю, что это это ошибка TypeScript, так как VS Code не имеет претензий. Я считаю, что это проблема с автоматическим c насмешкой Jest.
admin.firebase()
- допустимый вызов. Файл определения TypeScript определяет его как function firestore(app?: admin.app.App): admin.firestore.Firestore;
Я читал документацию Jest, но не понимаю, как это исправить.
Это моя функция:
// /src/lib/database.ts
import * as admin from "firebase-admin"
/**
* Connect to the database
* @param key - a base64 encoded JSON string of serviceAccountKey.json
* @returns - a Cloud Firestore database connection
*/
export function connectToDatabase(key: string): FirebaseFirestore.Firestore {
// irrelevant code to convert the key
try {
admin.initializeApp({
credential: admin.credential.cert(key),
})
} catch (error) {
throw new Error(`Firebase initialization failed. ${error.message}`)
}
return admin.firestore() // this is where it throws the error
}
Вот мой тестовый код:
// /tests/lib/database.spec.ts
jest.mock("firebase-admin")
import * as admin from "firebase-admin"
import { connectToDatabase } from "@/lib/database"
describe("database connector", () => {
it("should connect to Firebase when given valid credentials", () => {
const key = "ewogICJkdW1teSI6ICJUaGlzIGlzIGp1c3QgYSBkdW1teSBKU09OIG9iamVjdCIKfQo=" // dummy key
connectToDatabase(key) // test fails here
expect(admin.initializeApp).toHaveBeenCalledTimes(1)
expect(admin.credential.cert).toHaveBeenCalledTimes(1)
expect(admin.firestore()).toHaveBeenCalledTimes(1)
})
})
Вот мой соответствующий (или, возможно, соответствующий) пакет. json (установлен с Yarn v1):
{
"dependencies": {
"@firebase/app-types": "^0.6.0",
"@types/node": "^13.13.5",
"firebase-admin": "^8.12.0",
"typescript": "^3.8.3"
},
"devDependencies": {
"@types/jest": "^25.2.1",
"expect-more-jest": "^4.0.2",
"jest": "^25.5.4",
"jest-chain": "^1.1.5",
"jest-extended": "^0.11.5",
"jest-junit": "^10.0.0",
"ts-jest": "^25.5.0"
}
}
И мой шуточный конфиг:
// /jest.config.js
module.exports = {
setupFilesAfterEnv: ["jest-extended", "expect-more-jest", "jest-chain"],
preset: "ts-jest",
errorOnDeprecated: true,
testEnvironment: "node",
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
},
moduleFileExtensions: ["ts", "js", "json"],
testMatch: ["<rootDir>/tests/**/*.(test|spec).(ts|js)"],
clearMocks: true,
}