Оболочка 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 Console.
- Убедитесь, что выбрана учетная запись службы 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
После выполнения этих шагов ваши тесты функций могут получить доступ к Firebase и Google API с помощью Admin SDK . Например, при тестировании триггера аутентификации эмулируемая функция может вызывать admin.auth().getUserByEmail(email)
.
Обслуживание функций с помощью оболочки Cloud Functions
Оболочка Cloud Functions эмулирует все типы триггеров функций с интерактивной оболочкой для вызова функций с тестовыми данными. Параметры зависят от типа функции, но основной формат использования:
myFunctionName(data, options)
Параметр data
требуется для триггеров базы данных реального времени, Cloud Firestore и PubSub и является необязательным для всех других типов функций. Кроме того, необязательный параметр options
действителен только для функций Realtime Database и 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
Вы можете вызвать функцию 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);
Вызвать функции хранения и аутентификации
Для функций Storage и Auth вызовите локальную функцию с тестовыми данными, которые вы хотели бы видеть внутри функции. Ваши тестовые данные должны соответствовать соответствующим форматам данных:
- Для облачного хранилища:
ObjectMetadata
- Для аутентификации:
UserRecord
Укажите только те поля, от которых зависит ваш код, или вообще не указывайте, если вы хотите только запустить функцию.