Je ne trouve pas la solution dans Document Firebase .
Je veux tester mes fonctions functions.https.onCall
localement. Est-il possible d’utiliser le shell ou de connecter mon client (firebase SDK activé) au serveur local?
Je veux éviter de devoir déployer chaque fois juste pour tester une modification de mes fonctions onCall
.
Une fonction :
exports.myFunction = functions.https.onCall((data, context) => {
// Do something
});
Client:
const message = { message: 'Hello.' };
firebase.functions().httpsCallable('myFunction')(message)
.then(result => {
// Do something //
})
.catch(error => {
// Error handler //
});
Les callables ne sont que des fonctions HTTPS avec un format spécifique. Vous pouvez tester comme une fonction HTTPS , sauf que vous devez écrire du code pour le livrer comme indiqué par le protocole défini dans la documentation .
Pour localement vous devez appeler (après firebase.initializeApp)
firebase.functions().useFunctionsEmulator('http://localhost:5000')
Bien que les documents officiels Firebase Cloud Function n’aient pas encore été mis à jour, vous pouvez maintenant utiliser firebase-functions-test avec les fonctions onCall
.
Vous pouvez voir un exemple dans leur référentiel .
J'ai réussi à tester mes fonctions TypeScript en utilisant jest, voici un bref exemple. Il y a quelques particularités ici, comme une commande d'importation, alors assurez-vous de lire la documentation :-)
/* functions/src/test/index.test.js */
/* dependencies: Jest and jest-ts */
const admin = require("firebase-admin");
jest.mock("firebase-admin");
admin.initializeApp = jest.fn(); // stub the init (see docs)
const fft = require("firebase-functions-test")();
import * as funcs from "../index";
// myFunc is an https.onCall function
describe("test myFunc", () => {
// helper function so I can easily test different context/auth scenarios
const getContext = (uid = "test-uid", email_verified = true) => ({
auth: {
uid,
token: {
firebase: {
email_verified
}
}
}
});
const wrapped = fft.wrap(funcs.myFunc);
test("returns data on success", async () => {
const result = await wrapped(null, getContext());
expect(result).toBeTruthy();
});
test("throws when no Auth context", async () => {
await expect(wrapped(null, { auth: null })).rejects.toThrow(
"No authentication context."
);
});
});