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 wywołań.

Konfigurowanie danych logowania administratora (opcjonalnie)

Jeśli chcesz, aby testy funkcji wchodziły w interakcję z interfejsami API Google lub innymi interfejsami API Firebase za pomocą pakietu Firebase Admin SDK, być może trzeba będzie skonfigurować dane logowania administratora.

  • Cloud Firestore i Realtime Database mają już wystarczające dane logowania i nie wymagają dodatkowej konfiguracji.
  • Wszystkie inne interfejsy API, w tym interfejsy API Firebase, takie jak Authentication i FCM, oraz interfejsy API Google, takie jak Cloud Translation czy Cloud Speech, wymagają wykonania czynności opisanych w tej sekcji. Dotyczy to zarówno korzystania z powłoki Cloud Functions, jak i z firebase emulators:start.

Aby skonfigurować dane logowania administratora dla emulowanych funkcji:

  1. Otwórz panel Konta usługi w konsoli Google Cloud.
  2. Upewnij się, że jest wybrane App Engine domyślne konto usługi , i użyj menu opcji po prawej stronie, aby wybrać Utwórz klucz.
  3. Gdy pojawi się prośba, wybierz JSON jako typ klucza i kliknij Utwórz.
  4. Ustaw domyślne dane logowania Google, aby 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
    

Po wykonaniu tych czynności testy funkcji mogą uzyskiwać dostęp do interfejsów API Firebase i Google za pomocą pakietu Admin SDK. Na przykład podczas testowania wywołania Authentication emulowana funkcja może wywołać admin.auth().getUserByEmail(email).

Uruchamianie funkcji za pomocą powłoki Cloud Functions

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

myFunctionName(data, options)

Parametr data jest wymagany w przypadku wywołań Bazy danych czasu rzeczywistego, Cloud Firestore i PubSub, a opcjonalny w przypadku wszystkich innych typów funkcji. Opcjonalny parametr options jest też prawidłowy tylko w przypadku funkcji Bazy danych czasu rzeczywistego i Cloud Firestore.

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

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

Instalowanie i konfigurowanie powłoki Cloud Functions

Aby korzystać z tej funkcji, pakiet firebase-tools musi mieć co najmniej wersję 3.11.0, a pakiet SDK firebase-functions – co najmniej wersję 0.6.2. Aby zaktualizować oba pakiety, uruchom te polecenia w katalogu functions/ projektu:

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

Jeśli używasz niestandardowych zmiennych konfiguracyjnych funkcji, najpierw uruchom polecenie, aby pobrać konfigurację niestandardową (uruchom to polecenie 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ę za pomocą tego polecenia:

firebase functions:shell

Wywoływanie funkcji HTTPS

Aby wywoływać funkcje HTTPS w powłoce, używaj tego samego sposobu co 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 Callable

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

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

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

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

Emulacja context.auth jest obecnie niedostępna.

Wywoływanie funkcji Bazy danych czasu rzeczywistego

Podczas lokalnego uruchamiania funkcji Bazy danych czasu rzeczywistego musisz podać odpowiednie dane testowe. Zwykle oznacza to podanie nowych danych testowych w przypadku operacji onCreate, starych lub usuniętych danych w przypadku operacji onDelete oraz obu tych rodzajów danych w przypadku funkcji onUpdate lub 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 udostępnia opcję params, która umożliwia symulowanie 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 zamiast tego uruchamiać funkcje jako konkretny użytkownik końcowy lub jako użytkownik nieuwierzytelniony:

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

Wywoływanie funkcji Firestore

Podczas lokalnego uruchamiania funkcji Firestore musisz podać odpowiednie dane testowe. Zwykle oznacza to podanie nowych danych testowych w przypadku operacji onCreate, starych lub usuniętych danych w przypadku operacji onDelete oraz obu tych rodzajów danych w przypadku funkcji onUpdate lub onWrite. Pamiętaj, że dane Firestore muszą być parami klucz-wartość. Więcej informacji znajdziesz w sekcji 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 symulować 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 symuluje zdarzenie utworzenia, aktualizacji lub usunięcia tak, jakby zostało ono wykonane przez użytkownika z dostępem administracyjnym.

Wywoływanie funkcji PubSub

W przypadku funkcji PubSub wstaw ładunek wiadomości w instancji Buffer i opcjonalnie dodaj 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 konkretnych pól danych zdarzenia, których potrzebuje 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 Storage i Auth

W przypadku funkcji Storage i Auth wywołaj funkcję lokalną z danymi testowymi, które chcesz zobaczyć w funkcji. Dane testowe muszą być zgodne z odpowiednimi formatami danych:

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