Fonctions de test interactives

Le shell Cloud Functions fournit un shell interactif pour appeler des fonctions avec des données de test. Le shell prend en charge tous les types de déclencheurs.

Configurer les informations d'identification de l'administrateur (facultatif)

Si vous souhaitez que vos tests de fonctions interagissent avec les API Google ou d'autres API Firebase via le SDK d'administration Firebase , vous devrez peut-être configurer les informations d'identification de l'administrateur.

  • Les déclencheurs Cloud Firestore et Realtime Database disposent déjà d'informations d'identification suffisantes et ne nécessitent aucune configuration supplémentaire.
  • Toutes les autres API, y compris les API Firebase telles que l'authentification et FCM ou les API Google telles que Cloud Translation ou Cloud Speech, nécessitent les étapes de configuration décrites dans cette section. Cela s'applique que vous utilisiez le shell Cloud Functions ou firebase emulators:start .

Pour configurer les informations d'identification d'administrateur pour les fonctions émulées :

  1. Ouvrez le volet Comptes de service de la console Google Cloud.
  2. Assurez-vous que le compte de service par défaut App Engine est sélectionné et utilisez le menu d'options à droite pour sélectionner Créer une clé .
  3. Lorsque vous y êtes invité, sélectionnez JSON pour le type de clé, puis cliquez sur Créer .
  4. Définissez vos informations d'identification Google par défaut pour qu'elles pointent vers la clé téléchargée :

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase functions:shell
    

    les fenêtres

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase functions:shell
    

Une fois ces étapes terminées, vos tests de fonctions peuvent accéder aux API Firebase et Google à l'aide du SDK Admin . Par exemple, lors du test d'un déclencheur d'authentification, la fonction émulée peut appeler admin.auth().getUserByEmail(email) .

Servir des fonctions à l'aide d'un shell Cloud Functions

Le shell Cloud Functions émule tous les types de déclencheurs de fonction avec un shell interactif pour appeler les fonctions avec des données de test. Les options varient selon le type de fonction, mais le format d'utilisation de base est :

myFunctionName(data, options)

Le paramètre data est requis pour les déclencheurs Realtime Database, Cloud Firestore et PubSub, et facultatif pour tous les autres types de fonctions. De plus, le paramètre facultatif options est valide uniquement pour les fonctions Realtime Database et Cloud Firestore.

En option, vous pouvez charger des données de test à partir d'un fichier local en enregistrant le fichier en tant que variable et en appelant une fonction avec celui-ci :

var data = require('./path/to/testData.json');
myFunction(data);

Installer et configurer le shell Cloud Functions

Pour utiliser cette fonctionnalité, firebase-tools doit avoir la version minimale 3.11.0 et le SDK firebase-functions doit avoir la version minimale 0.6.2. Pour mettre à jour les deux, exécutez les commandes suivantes dans le répertoire functions/ de votre projet :

npm install --save firebase-functions@latest
npm install -g firebase-tools

Si vous utilisez des variables de configuration de fonctions personnalisées, exécutez d'abord la commande pour obtenir votre configuration personnalisée (exécutez-la dans le répertoire functions ) dans votre environnement local :

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

Enfin, exécutez le shell avec la commande suivante :

firebase functions:shell

Invoquer des fonctions HTTPS

Pour appeler des fonctions HTTPS dans le shell, l'utilisation est la même que celle du module request NPM, mais remplacez request par le nom de la fonction que vous souhaitez émuler. Par exemple:

# invoke
myHttpsFunction()
myHttpsFunction.get()
myHttpsFunction.post()

# invoke at sub-path
myHttpsFunction('/path')
myHttpsFunction.get('/path')
myHttpsFunction.post('/path')

# send POST request with form data
myHttpsFunction.post('/path').form( {foo: 'bar' })

Invoquer des fonctions appelables HTTPS

Lorsque vous appelez localement des fonctions HTTPS Callable, vous devrez fournir des données de test appropriées.

# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})

Facultativement, vous pouvez transmettre un Firebase-Instance-ID-token comme deuxième paramètre. Cela doit être une chaîne.

# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})

L’émulation de context.auth est actuellement indisponible.

Appeler les fonctions de base de données en temps réel

Lors de l'exécution locale des fonctions de base de données en temps réel, vous devrez fournir des données de test appropriées. Cela signifie généralement fournir de nouvelles données de test pour les opérations onCreate , des données anciennes/supprimées pour les opérations onDelete , et les deux pour les fonctions onUpdate ou onWrite :

# invoke onCreate function
myDatabaseFunction('new_data')

# invoke onDelete function
myDatabaseFunction('old_data')

# invoke onUpdate or onWrite function
myDatabaseFunction({before: 'old_data', after: 'new_data' })

En plus des options before/after , le shell fournit l'option params à utiliser pour se moquer des caractères génériques dans un chemin :

# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})

Par défaut, le shell exécute les fonctions de base de données en temps réel avec les privilèges d'administrateur (compte de service). Utilisez l'option auth pour exécuter des fonctions en tant qu'utilisateur final particulier ou en tant qu'utilisateur non authentifié :

# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})

Invoquer les fonctions Firestore

Lorsque vous exécutez des fonctions Firestore localement, vous devrez fournir des données de test appropriées. Cela signifie généralement fournir de nouvelles données de test pour les opérations onCreate , des données anciennes/supprimées pour les opérations onDelete et les deux pour les fonctions onUpdate ou onWrite . Notez que les données Firestore doivent être des paires clé-valeur ; voir Types de données pris en charge .

# invoke onCreate function
myFirestoreFunction({foo: ‘new’})

# invoke onDelete function
myFirestoreFunction({foo: ‘old’})

# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })

En plus des champs before/after de l'objet data , vous pouvez utiliser les champs params de l'objet options pour simuler les caractères génériques dans un nom de document :

# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})

Le shell exécute toujours les fonctions Firestore avec des privilèges administratifs, ce qui signifie qu'il simule un événement de création/mise à jour/suppression comme s'il était effectué par un utilisateur administratif.

Invoquer des fonctions PubSub

Pour les fonctions PubSub, insérez la charge utile de votre message dans une instance Buffer et ajoutez éventuellement des attributs de données comme indiqué :

// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})

Appeler les fonctions Analytics

Vous pouvez appeler une fonction Analytics sans aucune donnée en exécutant myAnalyticsFunction() dans le shell. Pour exécuter la fonction avec des données de test, il est recommandé de définir une variable pour les champs de données d'événement spécifiques dont votre fonction a besoin :

var data = {
  eventDim: [{
    // populates event.data.params
    params: {foo: {stringValue: 'bar'} },
    // Also valid:
    //   {intValue: '10'}, {floatValue: '1.0'}, {doubleValue: '1.0'}
    // populates event.data.name
    name: 'event_name',
    // populates event.data.logTime, specify in microseconds
    timestampMicros: Date.now() * 1000,
    // populates event.data.previousLogTime, specify in microseconds
    previousTimestampMicros: Date.now() * 1000,
    // populates event.data.reportingDate, specify in 'YYYYMMDD' format
    date: '20170930',
    // populates event.data.valueInUSD
    valueInUsd: 230
  }],
  userDim: userDim
};

myAnalyticsFunction(data);

Invoquer les fonctions de stockage et d'authentification

Pour les fonctions de stockage et d'authentification, appelez la fonction locale avec les données de test que vous souhaitez voir à l'intérieur de la fonction. Vos données de test doivent suivre les formats de données correspondants :

Spécifiez uniquement les champs dont dépend votre code, ou aucun si vous souhaitez uniquement exécuter la fonction.