Ruby on rails Rails/Rspec对缺少查找的方法作出响应
我知道你们中的一些人已经开始怀疑我的理智了。我有一个Ruby on rails Rails/Rspec对缺少查找的方法作出响应,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我知道你们中的一些人已经开始怀疑我的理智了。我有一个ActiveRecord类,它使用method missing在它拥有的JSON属性中进行挖掘 # app/models/request_interactor.rb ... def method_missing(method_sym, *arguments, &block) return self.request_params[method_sym.to_s] if self.request_params[met
ActiveRecord
类,它使用method missing在它拥有的JSON属性中进行挖掘
# app/models/request_interactor.rb
...
def method_missing(method_sym, *arguments, &block)
return self.request_params[method_sym.to_s] if self.request_params[method_sym.to_s]
super
end
测试是这样的
before(:each) do
@ri = RequestInteractor.create(result: {magic_school: true, magic_learnt: 'all things magical'}, request_params: {application_id: 34, school_id: 20, school_name: 'Hogwarts', course_name: 'Defence against the Dark Arts.'})
end
it 'should respond to attributes set in the request parameters' do
expect(@ri).to respond_to(:school_name)
expect(@ri.school_name).to eq('Hogwarts')
end
我尝试在测试内部绑定,@ri.school\u name
将eq'Hogwarts'
,但当它运行响应时,它会失败,说没有这样的方法!那个肮脏的骗子
我在模型中尝试过这样做:
def respond_to?(method, include_private = false)
super || self.respond_to?(method, include_private)
end
但由于递归,这将返回太深的堆栈级别。。现在我这一天的命运掌握在你手中!开导我吧,伟大的人。如何测试缺少的方法的响应 使用。更多信息
现在,说了这么多。如果你问我的话,你的图案看起来还是很粗糙的
重构
Ruby有很多方法来清理这个
使用委派模式
delegate:method\u name,:to=>:request\u params
(选中文档中的其他选项)。这应该通过在对象中设置一个方法来解决您的问题,这样respond\u to?
将起作用,并且您将避免覆盖method\u missing
设置请求参数时生成访问方法(元编程访问器)
使用,因为可以使用散列
初始化,例如请求参数
。如果你在上面加上授权,你应该很酷
希望这有帮助。使用。更多信息
现在,说了这么多。如果你问我的话,你的图案看起来还是很粗糙的
重构
Ruby有很多方法来清理这个
使用委派模式
delegate:method\u name,:to=>:request\u params
(选中文档中的其他选项)。这应该通过在对象中设置一个方法来解决您的问题,这样respond\u to?
将起作用,并且您将避免覆盖method\u missing
设置请求参数时生成访问方法(元编程访问器)
使用,因为可以使用散列
初始化,例如请求参数
。如果你在上面加上授权,你应该很酷
希望这能有所帮助。Hey@muichkine谢谢你的建议,我没有考虑使用委派模式,我真的很喜欢!我使用它的唯一保留是,request_params
是一个JSON对象,所以它必须像访问散列一样访问它。因此,可能会丢失该方法,然后使用委托模式为响应提供一个钩子。请求参数在早期被设置为分配给对象,而RI对象只在稍后保存,因此我必须在保存之前使用过滤器对访问者进行元化。让我试试委托模式,它看起来是最好的:)TYHey@muichkine谢谢你的建议,我没有考虑使用委托模式,我真的很喜欢!我使用它的唯一保留是,request_params
是一个JSON对象,所以它必须像访问散列一样访问它。因此,可能会丢失该方法,然后使用委托模式为响应提供一个钩子。请求参数在早期被设置为分配给对象,而RI对象只在稍后保存,因此我必须在保存之前使用过滤器对访问者进行元化。让我试试委托模式,它看起来是最好的