Rspec收到了意外的消息:[]

时间:2014-01-31 18:48:38

标签: json facebook-graph-api ruby-on-rails-3.2 rspec2

我写了一个映射器,它匹配从facebook收到的属性并将它们设置为我的模型。

class Mapper::FacebookUser

  def initialize (user, facebook_user)
    @user = user
    @facebook_user = facebook_user
  end

  def name
    @user.name = @facebook_user['name'] if @facebook_user['name'] rescue false
  end
end

Facebook的回应是这样的:(JSON)

{
  "name": "Jo Doe"
}

我的user_spec就是:

require 'spec_helper.rb'

describe Mapper::FacebookUser do

  before(:each) do

    @facebook_user = double("FacebookUser")
    @user = User.new
  end

  it 'should map name to name' do
    @facebook_user.stub(:name).and_return("User Name")
    Mapper::FacebookUser.new(@user, @facebook_user).name
    @user.name.should eq("User Name")
  end
end
  

RSpec :: Mocks :: MockExpectationError:收到双重“Facebook”   意外消息:[] with(“name”)

我尝试了以下内容:

    @facebook_user.stub(:name).and_return("User Name")
    @facebook_user.stub("name").and_return("User Name")
    @facebook_user.stub(:[]).and_return({name: "User Name"})
    @facebook_user.stub(:[]).and_return({name: "User Name"}.to_json)

只有这一个有用,但我很确定,那不是那样的:

    @facebook_user.stub(:[]).and_return("User Name")

我的做法有什么问题? 我怎样才能让我的测试工作?

非常感谢

我使用rspec:

  • rspec(2.14.1)
  • rspec-core(2.14.7)
  • rspec-expectations(2.14.4)
  • rspec-mocks(2.14.4)
  • rspec-rails(2.14.0)

2 个答案:

答案 0 :(得分:1)

首先,您在模型中显然没有使用@facebook_event,因此我不确定您是否正在使用name。如果您想在:[]方法中使用 来存储对象/方法,则需要在@facebook_user上存根new方法您在@facebook_event来电时传入的对象。您收到错误的原因是因为您的存根该方法。

我假设您尝试使用Mapper::FacebookUser#[]存根的一种方法正在运行,因为真正的{{1}}方法以这种方式调用该对象。

答案 1 :(得分:0)

我的方法现在是

我希望这有助于某人

facebook_user = {  "name": "Jo Doe" }


class Mapper::FacebookUser

  def initialize (user, facebook_user={})

    @user = user # AR model
    # allows ['key'] or [:keys]
    @facebook_user = facebook_user.with_indifferent_access 
  end

  def name
    @user.name = @facebook_user.dig('name') # sets to nil if not present (works also with chains) >= Ruby 2.3
  end
end


require 'spec_helper.rb'
describe Mapper::FacebookUser do

  before(:each) do
    @user = User.new
    @facebook_user = {}
  end

  it 'should map name to name' do
    @facebook_user['name']
    Mapper::FacebookUser.new(@user, @facebook_user).name
    @user.name.should eq("User Name")
  end
end