Interaktywne testowanie funkcji

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

Konfigurowanie danych logowania administratora (opcjonalnie)

Jeśli chcesz, aby testy funkcji wchodziły w interakcje z interfejsami API Google lub innymi interfejsami Firebase API za pomocą pakietu SDK Firebase Admin, musisz skonfigurować dane logowania administratora.

  • Aktywatory Cloud Firestore i Bazy danych czasu rzeczywistego nie wymagają już dodatkowej konfiguracji i mają już wystarczającą ilość danych logowania.
  • Wszystkie pozostałe interfejsy API, w tym interfejsy API Firebase, takie jak Uwierzytelnianie i FCM lub Google API, np. Cloud Translation lub Cloud Speech, wymagają konfiguracji opisanej w tej sekcji. Dotyczy to zarówno powłoki Cloud Functions, jak i firebase emulators:start.

Aby skonfigurować dane logowania administratora dla emulowanych funkcji:

  1. Otwórz okienko kont usługi w konsoli Google Cloud.
  2. Zaznacz Domyślne konto usługi App Engine i w menu opcji po prawej stronie wybierz Utwórz klucz.
  3. Gdy pojawi się komunikat, jako typ klucza wybierz JSON 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
    

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

Udostępnianie funkcji za pomocą powłoki Cloud Functions

Powłoka w Cloud Functions emuluje wszystkie typy aktywatorów funkcji za pomocą interaktywnej powłoki służącej do wywoływania funkcji z danymi testowymi. 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. Jest też opcjonalny w przypadku wszystkich innych typów funkcji. Poza tym opcjonalny parametr options jest prawidłowy 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łyjąc za jego pomocą 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ę co najmniej 3.11.0, a pakiet SDK firebase-functions – minimalną wersję 0.6.2. Aby zaktualizować oba te elementy, uruchom następujące polecenia w katalogu functions/ swojego projektu:

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

Jeśli używasz niestandardowych zmiennych konfiguracji funkcji, najpierw uruchom to 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ę za pomocą tego polecenia:

firebase functions:shell

Wywołuj funkcje HTTPS

W przypadku wywoływania funkcji 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 wywoływanych przez HTTPS

Jeśli lokalnie wywołujesz funkcję HTTPS, musisz podać odpowiednie dane testowe.

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

Opcjonalnie można przekazać Firebase-Instance-ID-token jako drugi parametr. To musi być ciąg znaków.

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

Emulacja trybu context.auth jest obecnie niedostępna.

Wywoływanie funkcji bazy danych czasu rzeczywistego

Jeśli uruchamiasz ją lokalnie, musisz podać odpowiednie dane testowe. Ogólnie oznacza to udostępnienie nowych danych testowych dotyczących operacji onCreate, starych/usuniętych danych w przypadku operacji onDelete, a także 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 udostępnia opcję params, która pozwala na 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, by uruchomić funkcje jako określony użytkownik końcowy 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

Podczas uruchamiania funkcji Firestore lokalnie musisz podać odpowiednie dane testowe. Zasadniczo oznacza to udostępnienie nowych danych testowych dotyczących operacji onCreate, starych/usuniętych danych w przypadku operacji onDelete, zarówno dla funkcji onUpdate, jak i onWrite. Pamiętaj, że dane Firestore muszą mieć postać par 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żywać pól params w obiekcie options do imitowania symboli wieloznacznych 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 zdarzenia tworzenia, aktualizacji lub usuwania tak, jakby zrobił je użytkownik administracyjny.

Wywoływanie funkcji PubSub

W przypadku funkcji PubSub wstaw ładunek wiadomości w instancji Buffer i dodaj opcjonalne 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

Możesz wywołać funkcję Analytics bez żadnych danych, uruchamiając w powłoce myAnalyticsFunction(). Aby uruchomić funkcję z danymi testowymi, zalecamy zdefiniowanie zmiennej dla konkretnych 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łuj funkcje pamięci masowej i uwierzytelniania

W przypadku funkcji pamięci masowej i uwierzytelniania wywołaj funkcję lokalną z danymi testowymi, które chcesz zobaczyć w niej. Dane testowe muszą być w odpowiednich formatach:

Określ tylko te pola, od których zależy Twój kod, lub nie zaznaczaj w ogóle, jeśli chcesz uruchomić tylko daną funkcję.