Ошибка: ожидалась одна операция сопоставления для критерия «Совпадение узла документа», не найдена - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь написать тест для угловой службы, которую я использую с graphql & Apollo.Следуя этому руководству: Аполлон-тестирование

Я ценю вашу помощь!

Я получаю эту ошибку: Сбой: Ожидается одна операция сопоставления для критериев "Соответствие"DocumentNode ", не найдено.

rules.spec.ts

import { PlatformGraphQLService } from 'platform-graphql'
import { TestBed, ComponentFixture } from '@angular/core/testing'
import { RulesService, GET_RULE_QUERY } from './rules.service'
import {
  ApolloTestingModule,
  ApolloTestingController
} from 'apollo-angular/testing'
import { async } from '@angular/core/testing'
import { HttpClientTestingModule } from '@angular/common/http/testing'
import { RulesComponent } from './rules.component'
import { Apollo, ApolloModule } from 'apollo-angular'

describe('RulesService', () => {
  let controller: ApolloTestingController
  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        RulesComponent
      ],
      imports: [
        ApolloTestingModule,
        HttpClientTestingModule,
      ],
      providers: [
        PlatformGraphQLService,
        ApolloModule,
        Apollo
      ],
    })
    controller = TestBed.get(ApolloTestingController)
  })

  it('should return a rule from server', async(() => {
    const service: RulesService = TestBed.get(RulesService)

    service.loadRules()
      .valueChanges.subscribe(() => {
        expect(op.operation.variables.consequent.isExluded).toEqual(true)
      })

    const op = controller.expectOne(GET_RULE_QUERY)
    console.log(op)
    op.flush({
      'conditions': [
        {
          'glItemType': 'DEPARTMENT',
          'operation': 'LEQ',
          'value': 1300,
        },
        {
          'glItemType': 'SUBDEPARTMENT',
          'operation': 'GEQ',
          'value': 4805,
        }
      ],
      'consequent': {
        'isExluded': true,
      },
    })

  }))

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


})

1 Ответ

0 голосов
/ 03 апреля 2019

Не уверен, если вы все еще сталкиваетесь с этой проблемой, но я смог решить ее, используя этот комментарий в проблеме: https://github.com/apollographql/apollo-angular/issues/691#issuecomment-417293424.

Это сводится к трем частям:

  1. Добавление дополнительного провайдера в тестовый модуль
TestBed.configureTestingModule({
  ...
  providers: [
    ...
    {
      provide: APOLLO_TESTING_CACHE,
      useValue: new InMemoryCache({addTypename: true}),
    },
  ] 
});
Обернуть запрос в expectOne при вызове addTypenameToDocument
const op = controller.expectOne(addTypenameToDocument(getClientsQuery));
Добавьте соответствующие __typename к фиктивным данным ... Я считаю, что в вашем случае это выглядело бы так:
op.flush({
  'conditions': [
    {
      'glItemType': 'DEPARTMENT',
      'operation': 'LEQ',
      'value': 1300,
      '__typename': 'DefinedOnBackend'
    },
    {
      'glItemType': 'SUBDEPARTMENT',
      'operation': 'GEQ',
      'value': 4805,
      '__typename': 'DefinedOnBackend'
    }
  ],
  'consequent': {
    'isExluded': true,
    '__typename': 'DefinedOnBackend'
  },
})

Для меня это выглядело так (по сути, добавив __typename к каждой возвращаемой записи):

op.flush({
  data: {
    getClients: clients.map(c => ({ ...c, __typename: 'ClientDTO' }))
  }
});
...