У меня есть проект, который имеет фоновые функции (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);
});