Json Rspec收到意外消息:[]带有

Json Rspec收到意外消息:[]带有,json,facebook-graph-api,ruby-on-rails-3.2,rspec2,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'] rescu

我编写了一个映射程序,匹配从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)

我的用户规格是:

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” 意外消息:[]带有(“名称”)

我尝试了以下方法:

    @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核心(2.14.7)
  • rspec预期(2.14.4)
  • rspec模拟(2.14.4)
  • rspec导轨(2.14.0)

首先,您显然没有在您的模型中使用
@facebook\u event
,所以我不确定您是否在存根。如果您想在
名称
方法中存根您正在使用的对象/方法,您需要在
@facebook\u用户
调用时传递的对象上存根
:[]
方法。您得到错误的原因是您没有截取该方法

我假设您使用
@facebook\u事件
存根尝试的一种方法是有效的,因为真正的
映射器::facebook用户#[]
方法以这种方式调用该对象。

我的方法现在是 我希望这对某人有帮助

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

嗨,彼得,谢谢你关注我的问题。我编辑了我的帖子,我有一个复制粘贴错误,我很抱歉。我从未使用过
@facebook\u事件
,我将它们改为
@facebook\u用户
。我希望现在更清楚。即使进行了更改,您仍然有一个问题,即您已经删除了
name
方法,但是您在代码中使用了
[]
方法,正如我在回答中指出的那样。
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