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

Car*_*nez 5 ruby graphql-ruby

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

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

该gem建议不要直接测试该模式http://graphql-ruby.org/schema/testing.html,但是我仍然觉得知道模式何时意外更改很有价值。

具有这样的类型:

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
Run Code Online (Sandbox Code Playgroud)

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

Types::DeskType.fields['location'].type.to_s => 'String!'
Run Code Online (Sandbox Code Playgroud)

创建一个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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 4

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

相反,您可以使用 gems like:graphql-schema_comparator来打印重大更改。

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