Как я могу быстро протестировать функции Firebase - PullRequest
0 голосов
/ 23 мая 2019

Я работаю с Typescript над функциями firebase.Поскольку я занимался разработкой, мне было очень трудно тестировать (или экспериментировать) с кодом.Я использую плагин Lint, поэтому в аренду я вижу ошибки, связанные с выполнением кода.

Но я не могу запустить код и посмотреть, что получается:

У меня есть следующий код, который я хотел бы исправить и проверить:

    export const onPostUpdate = functions.database
.ref('/Posts/{uid}/{postID}')
.onCreate((snapshot, context) => {
  const uid = context.params.uid
  const postID = context.params.postID
  console.log('New postID:', postID)
  console.log('New uid:', uid)

  // const postData = snapshot.val()
  // console.log('New postData: ${postData["Media"]}')

  export const getUsersToBeUpdated = functions.https.onRequest((request, response) => {
    admin.database().doc('PeopleWhoFollowMe/\(uid)').get()
    .then(snapshot => {
      const data = snapshot.data()
      response.send(data)
    })
    .catch(error => {
      //handle error
      console.log(error)
      response.status(500).send(error)
    })
  })
  return console.log('New postID:', postID)
})

В этом случае я не знаю, что из этого получится: response.send(data).

Итак, каковы мои варианты для более быстрого тестирования?

Обновление:

На основании моего вопроса. Кажется, я не могу эмулировать триггеры базы данных реального времени, поскольку они еще не поддерживаются.Учитывая это, каковы мои варианты быстрого тестирования?

1 Ответ

1 голос
/ 23 мая 2019

У меня есть проект, который имеет фоновые функции (onUpdate, OnCreate) и функции HTTP. Самый простой способ проверить их - использовать простые модульные тесты.

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

В вашем коде, кажется, вы написали две функции.Один из них - триггер базы данных, а другой - функция HTTP.

Я постараюсь написать тесты для каждого, чтобы показать вам, как я это сделаю.Я использую jest

/functions
|--index.js
|--onCreate.js
|--getUsersToBeUpdated.js
|--/test
   |--onCreate.spec.js
   |--getUsersToBeUpdated.spec.js

index.js

const functions   = require('firebase-functions');

const onCreate    = require('./onCreate');
const getUsersToBeUpdated  = require('./getUsersToBeUpdated');

module.exports.onCreate = functions.database.ref('/Posts/{uid}/{postID}').onCreate(onCreate);
module.exports.getUsersToBeUpdated = functions.https.onRequest(getUsersToBeUpdated);

onCreate.spec.js

const onCreate = require('../onCreate');

let snapshot; 
let context;

beforeEach(() => {
    snapshot = {
        val: jest.fn()
    };

    context = {
        params: {id: 'ID_SOME_POST_ID'}
    };

});

test('that it should do something onCreate POST', () => {
    onCreate(snapshot, context);

    expect(snapshot.val).toHaveBeenCalled();
});

getUsersToBeUpdated.spec.js

const admin = require('firebase-admin');
const getUsersToBeUpdated = require(../getUsersToBeUpdated);

// we need to mock the funcionality of firebase-admin 
jest.mock('firebase-admin', () => {
    const admin = {};
    const snapshot = {
        data: jest.fn(() => ({propA: 'a', propB: 'b'}))
    };

    const admin.database = jest.fn(() => admin);
    const admin.doc = jest.fn(() => admin);
    const admin.get = jest.fn(() => Promise.resolve(snapshot));

    return admin;
});

let response;
let request;

beforeEach(() => {
    response = {};
    response.status = jest.fn();
    response.send = jest.fn();
    request = jest.fn();
});

// this function makes asynchronous requests so for simplicity Ill use async/await
test('that should return a successful request', async () => {
    await getUsersToBeUpdated(request, response);

    expect(response.send).toHaveBeenCalledWith({propA: 'a', propB: 'b'});
});

// this function makes asynchronous requests so for simplicity Ill use async/await
test('that should return a error request', async () => {
    const error = {code: 123, message: 'some error'};

    //force the get function to fail
    admin.get.mockReturnValueOnce(Promise.reject(error));

    await getUsersToBeUpdated(request, response);

    expect(response.status).toHaveBeenCalledWith(500);
    expect(response.send).toHaveBeenCalledWith(error);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...