Тестируйте функции в интерактивном режиме

Оболочка 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 .

Для настройки учетных данных администратора для эмулируемых функций:

  1. Откройте панель «Учетные записи служб» в консоли Google Cloud .
  2. Убедитесь, что выбрана учетная запись службы App Engine по умолчанию , и воспользуйтесь меню параметров справа, чтобы выбрать «Создать ключ» .
  3. При появлении запроса выберите JSON в качестве типа ключа и нажмите «Создать» .
  4. Настройте учетные данные Google по умолчанию так, чтобы они указывали на загруженный ключ:

    Unix

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

    Windows

    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 является обязательным для триггеров Realtime Database, Cloud Firestore и PubSub и необязательным для всех остальных типов функций. Кроме того, необязательный параметр options действителен только для функций Realtime Database и Cloud Firestore.

При желании вы можете загрузить тестовые данные из локального файла, сохранив файл в качестве переменной и вызвав функцию, использующую этот файл:

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

Установите и настройте оболочку Cloud Functions.

Для использования этой функции необходимо, чтобы firebase-tools имел минимальную версию 3.11.0, а firebase-functions SDK — минимальную версию 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 в командной оболочке используется тот же подход, что и с модулем NPM ` request , но замените 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 в настоящее время недоступна.

Вызов функций базы данных реального времени

При локальном запуске функций Realtime Database вам потребуется предоставить соответствующие тестовые данные. Как правило, это означает предоставление новых тестовых данных для операций 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);

Вызов функций хранения и аутентификации.

Для функций хранения и аутентификации вызовите локальную функцию с тестовыми данными, которые вы хотите увидеть внутри функции. Ваши тестовые данные должны соответствовать соответствующим форматам:

Укажите только те поля, от которых зависит ваш код, или не указывайте ни одного, если вам нужно только запустить функцию.