失败:期望标准“ Match DocumentNode”的一项匹配操作,未找到

时间:2019-01-30 20:54:15

标签: angular testing graphql karma-jasmine apollo

我正在尝试为与graphql和Apollo一起使用的角度服务编写测试。遵循本指南:apollo-testing

感谢您的帮助!

我收到此错误:失败:标准“匹配”需要一项匹配操作     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 :(得分:1)

不确定您是否仍然遇到此问题,但我能够使用以下问题的评论来解决它:https://github.com/apollographql/apollo-angular/issues/691#issuecomment-417293424

它可以归结为三部分:

  1. 向测试模块添加其他提供程序
TestBed.configureTestingModule({
  ...
  providers: [
    ...
    {
      provide: APOLLO_TESTING_CACHE,
      useValue: new InMemoryCache({addTypename: true}),
    },
  ] 
});
  1. 在对expectOne的调用中,将查询包装在addTypenameToDocument
const op = controller.expectOne(addTypenameToDocument(getClientsQuery));
  1. 在模拟数据中添加适当的__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' }))
  }
});