我的目标是在ruby中测试我的GraphQL模式的类型,我正在使用graphql-ruby gem。
我找不到任何最佳实践,所以我想知道什么是测试Schema的字段和类型的最佳方法。
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
我的第一种方法是在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
这种方法虽然有一些缺点:
答案 0 :(得分:3)
您似乎想测试架构,因为您想知道它是否会破坏客户端。基本上,您应该避免这种情况。
您可以使用graphql-schema_comparator
之类的宝石来打印重大更改。
答案 1 :(得分:0)
相对于我采用的第一种方法,我感觉是对GraphQL模式使用快照测试有所改进,而不是一个一个地测试每个类型/突变模式,而是创建了一个测试:
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-snapshot宝石see my PR here的略微修改版本。
gem不允许您像Jest这样使用单个命令来更新快照,因此我还创建了一个rake任务来删除当前快照:
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差异。
答案 2 :(得分:0)
顶级Schema对象具有一个#execute method。您可以使用它来编写类似
的测试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::Query::Result,但是它将大多数东西委托给嵌入式哈希。)