Я разрабатываю бэкэнд API (для android и iOS приложений) вокруг HttpsCallable облачных функций. Тестировать их через приложение становится довольно громоздким, поэтому я sh переключусь на модульное тестирование функций (до развертывания в производственной среде) с помощью инструмента firebase-functions-test
. Я следовал этому учебнику по модульному тестированию .
У меня проблемы с запуском модульных тестов в онлайн-режиме. Позвольте мне предоставить некоторые детали.
Вот мой `package. json 'content:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log",
"test": "mocha --reporter spec"
},
"engines": {
"node": "8"
},
"dependencies": {
"@google-cloud/tasks": "^1.9.0",
"@googlemaps/google-maps-services-js": "^2.0.2",
"chai": "^4.2.0",
"firebase-admin": "^8.6.0",
"firebase-functions": "^3.3.0",
},
"devDependencies": {
"eslint": "^5.12.0",
"eslint-plugin-promise": "^4.0.1",
"firebase-functions-test": "^0.1.7",
"mocha": "^7.1.1"
},
"private": true
}
Я использую API Google ( Указания , Геокодирование et c) из бэкэнда firebase, поэтому, чтобы иметь возможность доступа к ним во время выполнения моих тестов, я настроил свои тесты, расположенные на test/index.test.js
, как рекомендовано в Учебное пособие по модульному тестированию , следующим образом:
const firebaseConfig = {
apiKey: ...,
authDomain: ...,
databaseURL: "https://my-project.firebaseio.com",
projectId: "my-project",
storageBucket: "my-project.appspot.com",
messagingSenderId: ********,
appId: *********
};
const test = require('firebase-functions-test')(firebaseConfig
, 'path_to_json_keyfile/myproject.json');
Ниже приведен пример тестового кода. Обратите внимание, что все мои вызываемые функции возвращают HttpsError , и тест, приведенный ниже, просто проверяет поле code
для HttpsError
, если его ok
, тест проходит успешно. Функции, которые я тестирую, находятся в отдельном файле rides.js
, который index.js
экспортируется как exports.rides = require(./rides.js)
(не показан ниже)
const chai = require('chai');
const assert = chai.assert;
describe('Cloud functions', () => {
let rideFunctions;
before(() => {
rideFunctions = require('../index.js');
});
after(() => {
test.cleanup();
});
describe('getRideEstimate', () => {
it('should return ok', async () => {
data = {
riderType: 1,
pickup_lat: 37.0,
pickup_lng: -122,
dropoff_lat: 37.01,
dropoff_lng: -122.01,
scheduledTime: 1585939000,
ts: 1585939000,
tz_id: "uslax"
}
context = {
auth: {
uid: AUTH_ID_FOR_USER_ACCOUNT
}
};
const wrappedGetRideEstimate = test.wrap(rideFunctions.rides.getRideEstimate);
let httpsError = await wrappedGetRideEstimate(data, context);
return assert.equal(httpsError.code, 'ok');
});
})
describe('testCallable', () => {
it('should return ok', async () => {
data = {}
context = {}
const wrappedTestCallable = test.wrap(rideFunctions.rides.testCallable);
let httpsError = await wrappedTestCallable(data, context);
return assert.equal(httpsError.code, 'ok');
})
})
})
Проблема
- Моя простая
testCallable
функция вида
exports.testCallable = functions.https.onCall((data, context) => {
console.log('testCallable');
return new functions.https.HttpsError('ok', '', '');
})
проходит тест (как и ожидалось), но необъяснимым образом кажется, что он работает в автономном режиме, так как нет записи об этом в журналах облачных функций в консоли Firebase. Кроме того, если я отключу подключение моего ноутбука, результат теста останется прежним, предполагая, что эта функция каким-то образом работает в автономном режиме.
Моя функция getRideEstimate
, которая вызывает API Google Directions
, возвращает длинную ошибку 400
, указывающую на некоторую проблему с формированием запроса к API-интерфейсу. Я не знаю, связана ли эта ошибка с первой проблемой, но поскольку API-вызов Directions глубже внедряется в функцию getRideEstimate
, он предполагает, что функция вызывается, но каким-то образом API-вызов дает сбой.
Есть ли другой способ проверить функции HttpsCallable в онлайн-режиме?