1

我创建了一个接口类型,例如:

module UserErrorType
  include Types::BaseInterface

  definition_methods do
    def resolve_type(object, _ctx)
      ...
    end
  end
end

一个看起来像这样的查询:

query {
  thing {
    errors {
      code
      message
      ... on SomeDerivedType {
        blah
      }
    }
  }
}

当我在本地运行它时,一切正常,我能够解析我的派生类型并进入该resolve_type方法。

当我在 rspec 中运行时:

describe UserErrorType, type: :graphql_object do
  subject { execute(query, context) }
end

我收到以下错误:

GraphQL::RequiredImplementationMissingError: schema contains Interfaces or Unions,所以你必须定义一个resolve_type -> (obj, ctx) { ... }函数

根据我对错误消息的理解,它希望我将resolve_type方法直接放在Schema对象上,尽管我应该能够definition_methods像上面那样直接在接口中定义它。

4

1 回答 1

0

我不确定这是标准graphql-ruby做法还是我们实现的遗留物,但我们有一个测试支持文件,它将重新定义我们的模式(这可能是由于我们构建在 Rails 引擎内部并将我们的模式拼接在一起)。在这个支持文件中,我们有类似的内容:

@schema = OurEngine::Schema.define do
  query(query_type)
end

resolve_type在此处添加未使用的可以解决此问题:

@schema = OurEngine::Schema.define do
  query(query_type)

  resolve_type -> (_type, _obj, _ctx) do
    raise NoMethodError, 'Need to implement `resolve_type`'
  end
end

这个实现没有被使用(它使用特定于接口的resolve_type方法)但满足验证检查的要求。

于 2020-03-31T17:03:39.387 回答