web-dev-qa-db-fra.com

Comment tester les fonctions de cloud de firebase `functions.https.onCall` localement?

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.


Mon code

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 //
  });
5
czphilip

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 .

4
Doug Stevenson

Pour localement vous devez appeler (après firebase.initializeApp)

firebase.functions().useFunctionsEmulator('http://localhost:5000') 
5
Petr Pololáník

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."
    );
  });
});
0
Brendan McGill