es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

prueba unitaria de función en la nube, simular nuevo ID de documento

Para las pruebas unitarias de las funciones en TypeScript de Firestore Cloud, quiero simular el método doc().id, pero no doc('path'). ¿Cómo debo hacerlo?

admin.firestore().collection('posts').doc().id // Solo quiero simular esto

admin.firestore().collection('posts').doc('1')
<code>
Intenté hacer lo siguiente en sinon. Pero se queda en un bucle infinito en `sinon/proxy-invoke.js:50:47`:
</code>
const collection = admin.firestore().collection('posts');
sinon.stub(collection. 'doc').callsFake(path => 
   path === undefined ? mock : collection.doc(path)
);
sinon.stub(admin.firestore(), 'collection')
  .callThrough()
  .withArgs('posts')
  .returns(collection)
<code>
También intenté lo siguiente. Pero el método `doc(documentPath: string)` parece estar simulado también:
</code>
sinon.stub(collection, 'doc')
  //@ts-ignore
  .withArgs()
  .returns(mock)

Estoy abierto a usar otras bibliotecas de simulación si hay alguna solución alternativa.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para simular doc().id pero no doc('path') en las pruebas de unidad TypeScript de las funciones en la nube de Firestore, puedes usar el método sinon.stub() para crear un stub para el método doc() del objeto collection y luego devolver un objeto falso con una propiedad id cuando se llame a doc() sin argumentos.

    Aquí tienes un ejemplo de cómo podrías hacerlo:

    import * as admin from 'firebase-admin';
    import * as sinon from 'sinon';
    
    describe('Pruebas de funciones en la nube de Firestore', () => {
      let collectionStub: sinon.SinonStubbedInstance<admin.firestore.collectionreference>;
      let docStub: sinon.SinonStub;
    
      beforeEach(() => {
        collectionStub = sinon.createStubInstance(admin.firestore.CollectionReference);
        docStub = sinon.stub(collectionStub, 'doc');
    
        // Establecer valores falsos para doc().id
        const idStub = sinon.stub();
        idStub.value('mock-id');
        docStub.withArgs().returns({
          id: idStub,
        });
      });
    
      afterEach(() => {
        sinon.restore();
      });
    
      it('debería devolver el ID de la nueva publicación', async () => {
        // Llamar a la función que utiliza Firestore
        const result = await myCloudFunction();
    
        // Asegurarse de que se devolvió el ID correcto
        expect(result).toEqual('mock-id');
      });
    });
    

    En este ejemplo, usamos sinon.createStubInstance() para crear una instancia simulada de la clase CollectionReference y luego usamos sinon.stub() para crear un stub para el método doc() del objeto collectionStub.

    Luego usamos docStub.withArgs() para especificar que el stub solo debe responder cuando se llame a doc() sin argumentos, y devolvemos un objeto con una propiedad id que devuelve el valor de ID simulado.

    Al utilizar este enfoque, el método doc('path') no se verá afectado por el stub y aún podrá acceder a los documentos de Firestore utilizando sus rutas reales.</admin.firestore.collectionreference>

Comments are closed.