我写了一个映射器,它匹配从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:
答案 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