Interaktywne testowanie funkcji

Powłoka Cloud Functions udostępnia interaktywną powłokę do wywoływania funkcji z danymi testowymi. Powłoka obsługuje wszystkie typy aktywatorów.

Skonfiguruj dane logowania administratora (opcjonalnie)

Jeśli chcesz, aby testy funkcji działały z interfejsami API Google lub innymi interfejsami API Firebase za pomocą pakietu SDK Firebase Admin, konieczne może być skonfigurowanie danych logowania administratora.

  • Aktywatory Cloud Firestore i Bazy danych czasu rzeczywistego mają już wystarczające dane logowania i nie wymagają dodatkowej konfiguracji.
  • Wszystkie pozostałe interfejsy API, w tym interfejsy Firebase API, np. Authentication i FCM oraz interfejsy API Google, takie jak Cloud Translation czy Cloud Speech, wymagają wykonania kroków konfiguracji opisanych w tej sekcji. Ma to zastosowanie niezależnie od tego, czy używasz powłoki Cloud Functions, czy firebase emulators:start.

Aby skonfigurować dane logowania administratora na potrzeby emulowanych funkcji:

  1. Otwórz panel Konta usługi w konsoli Google Cloud.
  2. Upewnij się, że wybrana jest opcja Domyślne konto usługi App Engine i w menu opcji po prawej stronie wybierz Utwórz klucz.
  3. Gdy pojawi się prośba, wybierz typ klucza JSON i kliknij Utwórz.
  4. Ustaw swoje domyślne dane logowania Google, by wskazywały pobrany klucz:

    Unix

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

    Windows

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

Gdy wykonasz te czynności, testy funkcji będą dostępne dla Firebase i interfejsów API Google za pomocą pakietu Admin SDK. Na przykład podczas testowania aktywatora uwierzytelniania, emulowana funkcja może wywoływać metodę admin.auth().getUserByEmail(email).

Obsługa funkcji z użyciem powłoki Cloud Functions

Powłoka Cloud Functions emuluje wszystkie typy aktywatorów funkcji za pomocą interaktywnej powłoki do wywoływania funkcji z danymi testowymi. Dostępne opcje różnią się w zależności od typu funkcji, ale podstawowy format użycia to:

myFunctionName(data, options)

Parametr data jest wymagany w przypadku aktywatorów Bazy danych czasu rzeczywistego, Cloud Firestore i PubSub, oraz opcjonalny w przypadku wszystkich innych typów funkcji. Poza tym opcjonalny parametr options ma zastosowanie tylko w przypadku funkcji Bazy danych czasu rzeczywistego i Cloud Firestore.

Opcjonalnie możesz wczytać dane testowe z pliku lokalnego, zapisując go jako zmienną i wywołując z nią funkcję:

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

Instalowanie i konfigurowanie powłoki Cloud Functions

Aby można było korzystać z tej funkcji, firebase-tools musi mieć wersję 3.11.0 lub nowszą, a pakiet SDK firebase-functions – co najmniej 0.6.2. Aby zaktualizować oba, uruchom w projekcie w katalogu functions/ te polecenia:

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

Jeśli używasz zmiennych konfiguracji funkcji niestandardowych, najpierw uruchom polecenie, aby uzyskać niestandardową konfigurację (uruchom ją w katalogu functions) w środowisku lokalnym:

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

Na koniec uruchom powłokę tym poleceniem:

firebase functions:shell

Wywoływanie funkcji HTTPS

Jeśli chcesz wywoływać funkcje HTTPS w powłoce, użycie jest takie samo jak w przypadku modułu NPM request, ale zastąp request nazwą funkcji, którą chcesz emulować. Przykład:

# 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' })

Wywoływanie funkcji HTTPS wywoływanych przez HTTPS

Podczas lokalnego wywoływania funkcji wywoływanych przez HTTPS musisz podać odpowiednie dane testowe.

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

Opcjonalnie jako drugi parametr możesz przekazać Firebase-Instance-ID-token. Musi to być ciąg znaków.

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

Emulacja funkcji context.auth jest obecnie niedostępna.

Wywoływanie funkcji bazy danych czasu rzeczywistego

Gdy uruchamiasz funkcje Bazy danych czasu rzeczywistego lokalnie, musisz udostępnić odpowiednie dane testowe. Zwykle oznacza to przesłanie nowych danych testowych dla operacji onCreate, starych/usuniętych danych dla operacji onDelete oraz zarówno dla funkcji onUpdate, jak i 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' })

Oprócz opcji before/after powłoka zawiera opcję params, której można używać do imitowania symboli wieloznacznych w ścieżce:

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

Domyślnie powłoka uruchamia funkcje Bazy danych czasu rzeczywistego z uprawnieniami administratora (konta usługi). Użyj opcji auth, aby uruchamiać funkcje jako konkretny użytkownik lub jako nieuwierzytelniony użytkownik:

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

Wywoływanie funkcji Firestore

Gdy uruchamiasz funkcje Firestore lokalnie, musisz udostępnić odpowiednie dane testowe. Zwykle oznacza to przesyłanie nowych danych testowych dla operacji onCreate, starych/usuniętych danych dla operacji onDelete oraz zarówno dla funkcji onUpdate, jak i onWrite. Pamiętaj, że dane Firestore muszą być parami klucz-wartość. Zobacz Obsługiwane typy danych.

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

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

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

Oprócz pól before/after obiektu data możesz użyć pól params w obiekcie options, aby imitować symbole wieloznaczne w nazwie dokumentu:

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

Powłoka zawsze uruchamia funkcje Firestore z uprawnieniami administratora, co oznacza, że imituje zdarzenie tworzenia, aktualizacji lub usuwania tak, jakby zostało wykonane przez użytkownika z uprawnieniami administratora.

Wywołaj funkcje PubSub

W przypadku funkcji PubSub wstaw ładunek wiadomości do instancji Buffer i dodaj opcjonalnie atrybuty danych, jak pokazano poniżej:

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

Wywoływanie funkcji Analytics

Funkcję Analytics możesz wywołać bez żadnych danych, uruchamiając w powłoce polecenie myAnalyticsFunction(). Aby uruchomić funkcję z danymi testowymi, zalecamy zdefiniowanie zmiennej dla określonych pól danych zdarzenia, których potrzebuje Twoja funkcja:

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);

Wywoływanie funkcji pamięci i uwierzytelniania

W przypadku funkcji przechowywania i uwierzytelniania wywołaj funkcję lokalną z danymi testowymi, które chcesz zobaczyć wewnątrz funkcji. Dane testowe muszą być w odpowiednim formacie:

Określ tylko pola, od których zależy kod, lub nie podawaj żadnych, jeśli chcesz tylko uruchomić funkcję.