Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails/Rspec对缺少查找的方法作出响应_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

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对象只在稍后保存,因此我必须在保存之前使用
    过滤器对访问者进行元化。让我试试委托模式,它看起来是最好的