Модульное тестирование облачных функций HttpsCallable - онлайн-режим - PullRequest
0 голосов
/ 05 апреля 2020

Я разрабатываю бэкэнд 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');

    })
  })


})

Проблема

  1. Моя простая 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 в онлайн-режиме?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...