如何在 Rails 引擎 rspec 中模拟 GraphQL 类型?

How to mock a GraphQL type in Rails engine rspec?

我在 Rails 引擎中工作,我有一个 GraphQL 类型。

module RailsEngine
  module Graph
    module RailsEngine
      module Types
        MyClass = GraphQL::ObjectType.define do
          # some working code here

          field :user, RailsEngine.graph_user_type.constantize, 'The description of user'
        end
      end
    end
  end
end

graph_user_type 是我在 mattr_accessor 中定义的一种方法,我正在通过初始化程序从主 Rails 应用程序获取特定的 class 用户。

当我 运行 我的 Rspec 测试这种类型时,我收到一个错误 NameError: uninitialized constant Graph

所以我想像这样模拟整行 field :user, RailsEngine.graph_user_type.constantize, 'The description of user'

  before do
    user_type = double('Graph::User::Types::User')
    allow(described_class.fields['user']).to receive(:constantize).and_return(user_type)
  end

我也试过allow(described_class.fields['user']).to receive(:type).and_return(user_type)也没用!

但我仍然遇到同样的错误!有什么想法吗?

Failure/Error: field :user, RailsEngine.graph_user_type.constantize, 'The description of user'

NameError:
  uninitialized constant Graph```


before do
  user_type = double('Graph::User::Types::User')
  allow(described_class.fields['user']).to receive(:constantize).and_return(user_type)
end

您需要了解 allow 方法的作用。它需要一个对象,之后的期望值设置为 .to receive(...)

似乎更有意义的是:

allow(RailsEngine).to receive(:graph_user_type).and_return('Graph::User::Types::User')

或者,如果你需要它 return 双倍的,你会像

allow(RailsEngine).to receive_message_chain('graph_user_type.constantize').and_return(user_type)

https://relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/message-chains

通过这种方式,您可以控制 RailsEngine.graph_user_type 正在 return 的内容,并作为第二个参数传递给 field

原来这个问题隐藏在这里

graph_user_type is a method that I define in the mattr_accessor and am getting a specific class of User from the main Rails app through the initializer.

由于我是通过初始化程序从主应用程序获取方法 graph_user_type 到引擎,所以在加载规范之前,错误已经抛出 - 因此在规范中模拟它是没有用的。

解决方案是将主应用程序初始化程序所具有的相同内容添加到引擎内的虚拟初始化程序(指示数据被模拟)

这是我的初始化程序: RailsEngine.graph_user_type = 'Graph::User::Types::User'

这是我在引擎中的虚拟初始化程序: RailsEngine.graph_user_type = 'MockUserType'