2014-01-31 3 views
1

Я пишу картограф, который соответствует атрибутам, полученным из facebook, и устанавливает их в мою модель.Rspec получил неожиданное сообщение: [] с

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: Double "Facebook" received unexpected message :[] 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-ядро (2.14.7)
  • RSpec-ожидания (2.14.4)
  • rspec-mocks (2.14.4)
  • rspec-rails (2.14.0)

ответ

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 
1

Во-первых, вы явно не используете @facebook_event в своей модели, поэтому я не уверен, что вы его обманываете. Если вы хотите заглушить объект/метод, вы: :, используя в своем методе name, вам нужно будет заглушить метод :[] на объекте @facebook_user, который вы передаете на свой вызов new. Причина, по которой вы получаете ошибку, которую вы получаете, заключается в том, что ваш не, укусив этот метод.

Я предполагаю, что один подход, который вы пробовали с @facebook_event, работает, потому что реальный метод Mapper::FacebookUser#[] вызывает этот объект таким образом.

+0

Привет Питер, спасибо за участие в моей проблеме. Я отредактировал мой пост, у меня была ошибка с копией, мне очень жаль. Я никогда не использовал '' '@ facebook_event''', я изменил их на' '' @ facebook_user'''. Надеюсь, теперь все ясно. – Jan

+0

Даже при этом изменении у вас все еще есть проблема, что вы наложили метод 'name', но вы используете метод' [] 'в своем коде, как я указал в своем ответе. –

Смежные вопросы