Оболочка Cloud Functions предоставляет интерактивную оболочку для вызова функций с тестовыми данными. Оболочка поддерживает все типы триггеров.
Настройте учетные данные администратора (необязательно)
Если вы хотите, чтобы ваши тесты функций взаимодействовали с API Google или другими API Firebase через Firebase Admin SDK , вам может потребоваться настроить учетные данные администратора.
- Триггеры Cloud Firestore и Realtime Database уже имеют достаточные учетные данные и не требуют дополнительной настройки.
- Все остальные API, включая API Firebase, такие как Authentication и FCM , или API Google, такие как Cloud Translation или Cloud Speech, требуют действий по настройке, описанных в этом разделе. Это применимо независимо от того, используете ли вы оболочку Cloud Functions или
firebase emulators:start
.
Чтобы настроить учетные данные администратора для эмулируемых функций:
- Откройте панель «Учетные записи служб» консоли Google Cloud .
- Убедитесь, что выбрана учетная запись службы App Engine по умолчанию , и в меню параметров справа выберите «Создать ключ» .
- При появлении запроса выберите JSON в качестве типа ключа и нажмите «Создать» .
Установите свои учетные данные Google по умолчанию, чтобы они указывали на загруженный ключ:
Юникс
export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json" firebase functions:shell
Окна
set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json firebase functions:shell
После выполнения этих шагов ваши функциональные тесты смогут получить доступ к API Firebase и Google с помощью Admin SDK . Например, при тестировании триггера Authentication эмулируемая функция может вызвать admin.auth().getUserByEmail(email)
.
Обслуживание функций с помощью оболочки Cloud Functions
Оболочка Cloud Functions эмулирует все типы триггеров функций с помощью интерактивной оболочки для вызова функций с тестовыми данными. Опции различаются в зависимости от типа функции, но основной формат использования следующий:
myFunctionName(data, options)
Параметр data
является обязательным для триггеров базы данных реального времени, Cloud Firestore и PubSub и необязательным для всех остальных типов функций. Кроме того, параметр необязательных options
действителен только для функций базы данных реального времени и Cloud Firestore.
При желании вы можете загрузить тестовые данные из локального файла, сохранив файл как переменную и вызвав с ее помощью функцию:
var data = require('./path/to/testData.json');
myFunction(data);
Установите и настройте оболочку Cloud Functions.
Чтобы использовать эту функцию, firebase-tools
должны иметь минимальную версию 3.11.0, а SDK firebase-functions
должен иметь минимальную версию 0.6.2. Чтобы обновить оба, выполните следующие команды в каталоге functions/
вашего проекта:
npm install --save firebase-functions@latest
npm install -g firebase-tools
Если вы используете переменные конфигурации пользовательских функций, сначала запустите команду, чтобы получить вашу пользовательскую конфигурацию (запустите ее в каталоге functions
) в вашей локальной среде:
firebase functions:config:get > .runtimeconfig.json # If using Windows PowerShell, replace the above with: # firebase functions:config:get | ac .runtimeconfig.json
Наконец, запустите оболочку с помощью следующей команды:
firebase functions:shell
Вызов функций HTTPS
Для вызова функций HTTPS в оболочке используется то же самое, что и для модуля request
NPM, но замените request
именем функции, которую вы хотите эмулировать. Например:
# 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' })
Вызов вызываемых функций HTTPS
При локальном вызове вызываемых функций HTTPS вам необходимо предоставить соответствующие тестовые данные.
# invoke
myCallableFunction('test data')
myCallableFunction({'foo': 'bar'})
При желании вы можете передать Firebase-Instance-ID-token
в качестве второго параметра. Это должна быть строка.
# invoke with FCM registration token
myCallableFunction('test data', {instanceIdToken: 'sample token'})
Эмуляция context.auth
в настоящее время недоступна.
Вызов функций базы данных реального времени
При локальном запуске функций базы данных реального времени вам необходимо предоставить соответствующие тестовые данные. Обычно это означает предоставление новых тестовых данных для операций onCreate
, старых/удаленных данных для операций onDelete
, а также для функций onUpdate
и 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' })
В дополнение к параметрам before/after
оболочка предоставляет параметр params
, который можно использовать для имитации подстановочных знаков в пути:
# mock wildcards in path, for example: if the path was input/{group}/{id}
myDatabaseFunction('data', {params: {group: 'a', id: 123}})
По умолчанию оболочка запускает функции базы данных реального времени с правами администратора (служебной учетной записи). Используйте опцию auth
, чтобы вместо этого запускать функции от имени конкретного конечного пользователя или от имени неаутентифицированного пользователя:
# to mock unauthenticated user
myDatabaseFunction('data', {authMode: 'USER'})
# to mock end user
myDatabaseFunction('data', {auth: {uid: 'abcd'}})
Вызов функций Firestore
При локальном запуске функций Firestore вам необходимо предоставить соответствующие тестовые данные. Обычно это означает предоставление новых тестовых данных для операций onCreate
, старых/удаленных данных для операций onDelete
, а также для функций onUpdate
и onWrite
. Обратите внимание, что данные Firestore должны быть парами ключ-значение; см. Поддерживаемые типы данных .
# invoke onCreate function
myFirestoreFunction({foo: ‘new’})
# invoke onDelete function
myFirestoreFunction({foo: ‘old’})
# invoke onUpdate or onWrite function
myFirestoreFunction({before: {foo: ‘old’}, after: {foo: ‘new’} })
В дополнение к полям before/after
объекта data
вы можете использовать поля params
объекта options
для имитации подстановочных знаков в имени документа:
# mock wildcards in document name, for example: if the name was input/{group}/{id}
myFirestoreFunction({foo: ‘new’}, {params: {group: 'a', id: 123}})
Оболочка всегда запускает функции Firestore с правами администратора, что означает, что она имитирует событие создания/обновления/удаления, как если бы оно было выполнено пользователем с правами администратора.
Вызов функций PubSub
Для функций PubSub вставьте полезную нагрузку сообщения в экземпляр Buffer
и при необходимости добавьте атрибуты данных, как показано:
// invokes a function with the JSON message { hello: 'world' } and attributes { foo: 'bar' }
myPubsubFunction({data: new Buffer('{"hello":"world"}'), attributes: {foo: 'bar'}})
Вызов функций аналитики
Вы можете вызвать функцию Analytics без каких-либо данных, запустив myAnalyticsFunction()
в оболочке. Чтобы запустить функцию с тестовыми данными, рекомендуется определить переменную для конкретных полей данных событий, которые необходимы вашей функции:
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);
Вызов функций хранения и аутентификации
Для функций хранения и аутентификации вызовите локальную функцию с тестовыми данными, которые вы хотите видеть внутри функции. Ваши тестовые данные должны соответствовать соответствующим форматам данных:
- Для Cloud Storage :
ObjectMetadata
- Для Authentication :
UserRecord
Укажите только те поля, от которых зависит ваш код, или не указывайте вообще, если вы хотите запустить только функцию.