为什么我得到" #to_hash已被弃用。改用#to_h"用RSpec测试时?

时间:2014-08-06 12:56:22

标签: ruby-on-rails rspec rspec-rails

我从Rails开始,我正在尝试习惯RSpec编写一些测试。在这个特定的例子中,我正在尝试测试一个执行twitter api调用的类。由于它有一个小的临时缓存,我试图测试只在必要时调用API或者它返回当前类型的对象。

我正在使用a Ruby Twitter client

before do
    @manager = TwitterService.new
    @manager.client = double()
    hash = JSON.parse('{"id":4}', :symbolize_names => true)
    allow(@manager.client).to receive(:friends) { [Twitter::User.new(hash)] }
end

it 'returns a collection of friends' do
  @result.each do |r|
    expect(r).to be_a Twitter::User 
  end
end

据我所见,执行中没有出现任何错误或警告,但是当我运行rspec时,我得到:

/home/myuser/.rvm/gems/ruby-2.1.0/gems/activesupport-4.1.1/lib/active_support/core_ext/object/json.rb:48:in `as_json': 
[DEPRECATION] #to_hash is deprecated. Use #to_h instead.

我甚至没有看到使用to_hash的地方。我想它可以在JSON.parse内部使用,但如果这是真的,我不知道如何改变它。即使一切似乎都有效,这些警告也会严重影响测试的可读性。

1 个答案:

答案 0 :(得分:2)

是的,可能你的JSON.parse在内部使用了as_json函数,它调用了to_hash。在轨道上'源代码它实际上是这样的:

class Object
  def as_json(options = nil) #:nodoc:
    if respond_to?(:to_hash)
      to_hash.as_json(options)
    else
      instance_values.as_json(options)
    end
  end
end

我想你可以说明,如果这对你很重要,那就检查一下吧。关于github的问题,要么关注它的发展方式,要么自己创建一个。