如何在 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'
我在 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'