Я пишу тест, который проверяет триггер firebase. Проблема, однако, в том, что я не могу заставить его работать. Я хочу использовать локальный эмулятор firestore и Jest, чтобы смоделировать изменение в firestore и посмотреть, выполняет ли триггер то, что ему нужно.
Мне нужна облачная функция в моем тесте, и я инициализирую свое приложение
Setup. js:
const firebase = require('@firebase/testing');
const PROJECT_ID = 'project';
let admin;
let db;
const setupAdmin = async () => {
admin = firebase.initializeAdminApp({
projectId: PROJECT_ID
});
db = admin.firestore();
};
const getAdmin = () => {
return admin;
};
const getDb = () => {
return db;
};
module.exports.setupAdmin = setupAdmin;
module.exports.getAdmin = getAdmin;
module.exports.getDb = getDb;
Test. js
describe('Billing', () => {
let dbRef;
beforeAll(async () => {
const {db, admin} = require('../../../functions/helpers/setup');
dbRef = db;
});
afterAll(async () => {
await Promise.all(firebase.apps().map(app => app.delete()));
console.log(`View rule coverage information at ${COVERAGE_URL}\n`);
});
it('test', async () => {
const mockData = {
'Users/user1': {
uid: 'user1'
},
['Users/user1/Taxes/' + new Date().getFullYear().toString()]: {
totalExpenseEuro: 0
}
};
for (const key in mockData) {
const ref = dbRef.doc(key);
await ref.set(mockData[key]);
}
// Create mockup data
await dbRef.collection('Users').doc('user1').collection('Expenses').doc('expense1').set({
amountEuroInclVAT: 100
});
// Make snapshot for state of database beforehand
const beforeSnap = test.firestore.makeDocumentSnapshot({amountEuroInclVAT: 0}, 'Users/user1/Expenses/expense1');
// Make snapshot for state of database after the change
const afterSnap = test.firestore.makeDocumentSnapshot(
{amountEuroInclVAT: 100},
'Users/user1/Expenses/expense1'
);
const change = test.makeChange(beforeSnap, afterSnap);
// Call wrapped function with the Change object
const wrapped = test.wrap(calculateTaxesOnExpenseUpdate);
wrapped(change, {
params: {
uid: 'test1'
}
});
});
});
Теперь основная проблема возникает, когда я пытаюсь получить доступ к этому объекту db в моем trigger
const calculateTaxesOnExpenseUpdate = functions.firestore
.document('Users/{uid}/Expenses/{expenseId}')
.onWrite(async (change, context) => {
const {getDb} = require('../helpers/setup'); // This setup is the same as above
let db = getDb();
...
По какой-то причине, когда я выполняю такое действие, как (await db.collection('Users').get()).get('totalExpenseEuro')
, Jest прекращает выполнение моего кода. Когда я устанавливаю отладчик сразу после этой строки, он никогда не печатается. Этот фрагмент кода дает сбой, и я понятия не имею, почему. Я думаю, что экземпляр БД не настроен должным образом в моей функции триггера облака.
Вопрос: Как лучше всего использовать экземпляр БД (admin.firestore ()) между функциями теста и триггера облака?