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 fallida de GraphQL / Apollo: Error: Se esperaba una operación coincidente con el criterio “Match DocumentNode”, pero no se encontró ninguna.

Estoy tratando de escribir una prueba para un servicio de Angular que estoy utilizando con graphql y Apollo.

Estoy recibiendo estos errores: Error: Se esperaba una operación coincidente para el criterio “Match DocumentNode”, no se encontró ninguna.

y
Error: Se esperaban operaciones abiertas, se encontró 1:

foo.spec.ts

import { TestBed } from '@angular/core/testing';
import {

….

const fragment: DocumentNode = gql`
  fragment SummaryDetails on SummaryDetails {
    foo


}
`;

const summaryQuery: DocumentNode = gql`
  query Summary(

  ) {
    Summary(

    ) {
      ...SummaryDetails
    }
  }
  ${fragment}
`;

const fundDataServiceParams: FundDataServiceParams = {
  foo ...
};

const expectedRawSummaryDetails: any = {
  Summary: [
    {
      foo ...
    },
  ],
};

const expectedSummaryDetails: SummaryDetail[] = [
  {
    foo ...
  },
];

describe('FundSummaryServiceRegisterMethod', () => {
  let controller: ApolloTestingController;
  let fundSummaryService: FundSummaryService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [ApolloTestingModule, HttpClientTestingModule],

    });

    controller = TestBed.inject(ApolloTestingController);
    foo = TestBed.inject(foo);
  });

  afterEach(() => {
    controller.verify();
  });

  fit('should return foodetails', (done: DoneFn) => {
    fundSummaryService
      .register(fragment, fundDataServiceParams)
      .subscribe((foo) => {
        expect(foo).toEqual(foo);
        done();
      });

    const op = controller.expectOne(fooQuery);
    expect(op.operation.variables.foo).toEqual(foo.foo); 
    op.flushData(expectedfoo);
  });

});

Nota: He probado la sugerencia de este antiguo post, no funcionó.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la prueba espera encontrar una operación coincidente para el criterio “Match DocumentNode”, pero no puede encontrar ninguna. Además, también detecta una operación de apertura inesperada.

    Para solucionar estos errores, prueba lo siguiente:

    1. Asegúrate de que la consulta GraphQL y el fragmento estén correctamente definidos y pasados como parámetros al método register en el servicio que se está probando.
    2. Verifica que los módulos GraphQL importados (en este caso, ApolloTestingModule) estén correctamente configurados en el bloque beforeEach e inyectados en el testbed.

    3. Verifica nuevamente las declaraciones expect para asegurarte de que estén coincidiendo correctamente con los datos esperados.

    4. Utiliza la función done para hacer que la prueba espere a que se complete el código asíncrono (como el método register) antes de verificar las expectativas.

    Aquí tienes una versión modificada del bloque de código que aborda los problemas mencionados anteriormente:

    describe('FundSummaryServiceRegisterMethod', () => {
      let controller: ApolloTestingController;
      let fundSummaryService: FundSummaryService;
    
      beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [ApolloTestingModule, HttpClientTestingModule],
        });
    
        controller = TestBed.inject(ApolloTestingController);
        fundSummaryService = TestBed.inject(FundSummaryService);
      });
    
      afterEach(() => {
        controller.verify();
      });
    
      it('should return foo details', (done: DoneFn) => {
        // Arrange: Definir la consulta y el fragmento, y establecer los datos esperados
        const fragmento: DocumentNode = gql`
          fragmento SummaryDetails en SummaryDetails {
            foo
          }
        `;
    
        const consultaResumen: DocumentNode = gql`
          consulta Summary {
            Summary {
              ...SummaryDetails
            }
          }
          ${fragmento}
        `;
    
        const parametrosServicioFondos: FundDataServiceParams = {
          foo: 'bar',
        };
    
        const detallesFooEsperados: FooDetail[] = [
          {
            foo: 'bar',
          },
        ];
    
        // Act: Llama al método de registro del servicio y espera la respuesta
        fundSummaryService
          .register(fragmento, parametrosServicioFondos)
          .subscribe((respuesta: any) => {
            // Assert: Verifica que los datos de la respuesta coincidan con los datos esperados
            expect(respuesta).toEqual(detallesFooEsperados);
            done(); // Señaliza a Jasmine que la prueba ha finalizado
          });
    
        // Espera a que se envíe la consulta y simula los datos de respuesta esperados
        const op = controller.expectOne(consultaResumen);
        op.flush({
          data: {
            Summary: detallesFooEsperados,
          },
        });
      });
    });
    

    En esta versión modificada, se cambia el bloque fit a un bloque it regular para evitar ejecutar solo un caso de prueba específico. Las consultas y los datos esperados se definen dentro de la prueba para mayor claridad. Por último, la prueba utiliza la función done para señalizar la finalización del código asíncrono.

Comments are closed.