首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用GraphQL测试graphql模式?

如何用GraphQL测试graphql模式?
EN

Stack Overflow用户
提问于 2018-07-06 04:12:42
回答 3查看 4K关注 0票数 5

我的目标是在ruby中测试我的GraphQL模式的类型,我正在使用。

我找不到这方面的最佳实践,所以我想知道测试Schema的字段和类型的最佳方法是什么。

gem建议不要直接测试模式( http://graphql-ruby.org/schema/testing.html ),但我仍然认为能够知道模式意外更改的时间是很有价值的。

有这样一种类型:

代码语言:javascript
复制
module Types
  class DeskType < GraphQL::Schema::Object
    field :id, ID, 'Id of this Desk', null: false
    field :location, String, 'Location of the Desk', null: false
    field :custom_id, String, 'Human-readable unique identifier for this desk', null: false
  end
end

我的第一种方法是在GraphQL::Schema::Object类型中使用fields哈希,例如:

代码语言:javascript
复制
Types::DeskType.fields['location'].type.to_s => 'String!'

创建一个RSpec匹配器,我可以想出如下所示的测试:

代码语言:javascript
复制
RSpec.describe Types::DeskType do
  it 'has the expected schema fields' do
    fields = {
      'id': 'ID!',
      'location': 'String!',
      'customId': 'String!'
    }

    expect(described_class).to match_schema_fields(fields)
  end
end

但是,这种方法有一些缺点:

  • matcher中的代码取决于类GraphQL::Schema::Object的实现,任何中断的更改都将在更新后破坏测试套件。
  • 我们重复代码,测试断言类型中相同的字段。
  • 编写这些测试非常繁琐,这使得开发人员编写这些测试的可能性更小。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-06 14:31:37

它看起来您想测试您的模式,因为您想知道它是否会破坏客户端。基本上你应该避免这样做。

相反,您可以使用宝石(如:graphql-schema_comparator )打印破缺更改。

  1. 我建议有一个rake任务来转储您的架构(并将其提交到您的repo中)。
  2. 您可以编写一些规范来检查模式是否是转储-然后您将确保始终有最新的模式转储。
  3. 设置您的CI以比较当前分支的架构和主分支上的架构。
  4. 如果架构有危险或破坏的更改,则失败构建。
  5. 您甚至可以使用模式比较器生成模式更改负载;)或者您甚至可以使用松弛通知将任何模式更改发送到那里,这样您的团队就可以轻松地跟踪任何更改。
票数 4
EN

Stack Overflow用户

发布于 2018-07-06 04:12:42

与第一种方法相比,我感觉到的是对GraphQL模式使用快照测试的改进,而不是一个接一个地测试每种类型/突变模式,我创建了一个测试:

代码语言:javascript
复制
RSpec.describe MySchema do
  it 'renders the full schema' do
    schema = GraphQL::Schema::Printer.print_schema(MySchema)
    expect(schema).to match_snapshot('schema')
  end
end

这种方法使用了rspec-快照 gem的稍微修改的版本请看我的公关

gem不允许您使用一个命令更新快照,比如在Jest中,所以我还创建了一个rake任务来删除当前快照:

代码语言:javascript
复制
namespace :tests do
  desc 'Deletes the schema snapshot'

  task delete_schema_snapshot: :environment do
    snapshot_path = Rails.root.join('spec', 'fixtures', 'snapshots', 'schema.snap')
    File.delete(snapshot_path) if File.exist?(snapshot_path)
  end
end

这样,当模式被修改时,您将得到相当大的RSpec差异。

票数 1
EN

Stack Overflow用户

发布于 2018-07-06 14:09:21

顶层架构对象有一个#执行方法.您可以使用这个来编写测试,例如

代码语言:javascript
复制
RSpec.describe MySchema do
  it 'fetches an object' do
    id = 'Zm9vOjE'
    query = <<~GRAPHQL
      query GetObject($id: ID!) {
        node(id: $id) { __typename id }
      }
    GRAPHQL
    res = described_class.execute(
      query,
      variables: { id: id }
    )
    expect(res['errors']).to be_nil
    expect(res['data']['node']['__typename']).to eq('Foo')
    expect(res['data']['node']['id']).to eq(id)
  end
end

#execute方法的返回值将是传统的HTTP样式响应,作为字符串键式哈希。(实际上它是一个GraphQL::查询::结果,但它将大部分事情委托给一个嵌入式哈希。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51202929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档