ruby - 如何使用 graphql-ruby 测试 GraphQL 模式?

标签 ruby graphql-ruby

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

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

gem 建议不要直接测试架构 http://graphql-ruby.org/schema/testing.html但我仍然发现能够知道架构何时意外更改很有值(value)。

有这样的类型:

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 哈希,例如:

Types::DeskType.fields['location'].type.to_s => 'String!'

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

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

虽然这种方法有一些缺点:

  • 匹配器中的代码取决于类 GraphQL::Schema::Object 的实现,任何重大更改都会在更新后破坏测试套件。
  • 我们正在重复代码,测试断言类型中的相同字段。
  • 编写这些测试变得乏味,这使得开发人员不太可能编写它们。

最佳答案

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

相反,您可以使用像这样的 gem:graphql-schema_comparator 来打印重大更改。

  1. 我建议有一个 rake 任务来转储你的模式(并在你的 repo 中提交它)。
  2. 您可以编写一些规范来检查模式是否已转储 - 然后您将确保您始终拥有最新的模式转储。
  3. 设置您的 CI 以将当前分支的架构与 master 分支上的架构进行比较。
  4. 如果架构有危险或破坏性更改,则构建失败。
  5. 您甚至可以使用 schema-comparator 生成架构变更日志 ;) 或者您甚至可以使用松弛通知将任何架构更改发送到那里,以便您的团队可以轻松跟踪任何更改。

关于ruby - 如何使用 graphql-ruby 测试 GraphQL 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51202929/

相关文章:

ruby - 如何使用 HAML 建表

ruby-on-rails - 在 Ruby on Rails 中隐藏字段

使用截断多项式 800516 将 CRC16 从 C 转换为 Ruby

没有参数的 Graphql 突变

ruby-on-rails - Graphql-ruby 如何将散列定义为类型

ruby-on-rails - 处理业务代码中的 GraphQL Enum 值

ruby-on-rails - 如何编译带有 Readline 支持的 Ruby?

ruby-on-rails - 来自带有参数的字符串的路径

ruby-on-rails - GraphQL Ruby N+1 批处理问题

ruby-on-rails - Ruby graphql 如何定义不是 Active Record 的对象类型?