Estoy tratando de probar este código de acceso de Firebase
let writeHomePromise = admin .database() .ref( "sm_matches/" + match.date + "/" + match.homeTeam.name + "/homeNGSPlayers" ) .set(match.homePlayers);utilizando Sinón.
Creo una coincidencia con
const match = { 'date' : '2902199', 'homeTeam' : '{"name" : "My_team"}', 'homePlayers' : ["Nomran Mailer", "Peter Bonetti"], 'awayPlayers': ["Ernst Blofeld", "Postman Pat"], };Y estoy intentando, sin éxito, burlarme de ese código con
let refStub = sinon.stub(); let setStub = sinon.stub(); refStub.withArgs('sm_matches/2902199/My_team/homeNGSPlayers').returns( {push: () => ({key: 'fakeKey', set: setStub})} ); lo que me da TypeError: Cannot read property 'set' of undefined .
Esta es mi primera incursión en Sinon, e incluso algo tan simple me está dando problemas.
¿Qué estoy haciendo mal?
Creo que debe llamar a admin.initializeApp() antes de usar cualquiera de los servicios de Firebase. El siguiente ejemplo utiliza la estrategia de prueba del modo fuera de línea.
Escriba pruebas unitarias aisladas y fuera de línea sin efectos secundarios. Esto significa que cualquier llamada a método que interactúe con un producto de Firebase (p. ej., escribir en la base de datos o crear un usuario) debe cerrarse. Por lo general, no se recomienda usar el modo fuera de línea si tiene funciones de Cloud Firestore o Realtime Database, ya que aumenta considerablemente la complejidad de su código de prueba.
Pruebe métodos de código auxiliar como este:
index.js :
const admin = require('firebase-admin'); admin.initializeApp(); function main() { const match = { date: '2902199', homeTeam: { name: 'My_team' }, homePlayers: ['Nomran Mailer', 'Peter Bonetti'], awayPlayers: ['Ernst Blofeld', 'Postman Pat'], }; return admin .database() .ref('sm_matches/' + match.date + '/' + match.homeTeam.name + '/homeNGSPlayers') .set(match.homePlayers); } module.exports = main; index.test.js :
const sinon = require('sinon'); const admin = require('firebase-admin'); describe('71267791', () => { it('should pass', async () => { const adminInitStub = sinon.stub(admin, 'initializeApp'); const databaseService = { ref: sinon.stub().returnsThis(), set: sinon.stub(), }; const databaseStub = sinon.stub().returns(databaseService); Object.defineProperty(admin, 'database', { get: () => databaseStub }); const main = require('./'); await main(); sinon.assert.calledOnce(adminInitStub); sinon.assert.calledOnce(admin.database); sinon.assert.calledWithExactly(databaseService.ref, 'sm_matches/2902199/My_team/homeNGSPlayers'); sinon.assert.calledWithExactly(databaseService.set, ['Nomran Mailer', 'Peter Bonetti']); }); });Resultado de la prueba:
71267791 ✓ should pass (655ms) 1 passing (661ms) ----------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------|---------|----------|---------|---------|------------------- All files | 100 | 100 | 100 | 100 | index.js | 100 | 100 | 100 | 100 | ----------|---------|----------|---------|---------|-------------------versiones del paquete:
"firebase-admin": "^10.0.2",