Тест Rspec всегда терпит неудачу для метода класса

как сказал предмет. Кажется, реализованный код всегда create создает новую запись, а не получает существующую.

Вот мой тестовый код rspec:

describe "#from_facebook" do 
  it "return existing related user" do 
    existing_user = FactoryGirl.create(:user)
    user_from_facebook = User.from_facebook({ uid: existing_user.uid })
    expect(user_from_facebook.email).to eql existing_user.email
  end
end

и вот тестовая реализация:

def self.from_facebook(fb_auth)
where(provider: "facebook", uid: fb_auth[:uid]).first_or_create do |user|
    user.email = fb_auth[:email]
    user.password = Devise.friendly_token[0, 20]
  end
end

Я всегда получал это:

1) User#from_facebook return existing related user
 Failure/Error: expect(user_from_facebook.email).to eql existing_user.email

   expected: "[email protected]"
        got: nil

   (compared using eql?)
 # ./spec/models/user_spec.rb:48:in `block (3 levels) in <top (required)>'

А вот результаты консоли через puts. для existing_user:

#<User id: 105, email: "[email protected]", encrypted_password: "$2a$04$90uzEdbwfnqfUL0CDhNOH.THUbzovFyJK1OPg7VcgxL...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2015-08-30 04:12:59", updated_at: "2015-08-30 04:12:59", auth_token: "vkvm2-fLe5x1dZGbewqw", provider: nil, uid: "133290925">

для user_from_facebook:

#<User id: nil, email: nil, encrypted_password: "$2a$04$lxdBWBsXY4febfgurgHJKOdNcOMCuQQO2DHshWChnxA...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: nil, updated_at: nil, auth_token: "", provider: "facebook", uid: "133290925">

Пожалуйста, дайте мне знать, что здесь не так. Заранее спасибо.


person ruwhan    schedule 30.08.2015    source источник
comment
В качестве примечания: User.from_facebook({ uid: exists_user.uid}) можно записать без фигурных скобок: User.from_facebook(uid: exists_user.uid)   -  person tessi    schedule 30.08.2015
comment
Что случилось ? Проверьте перечисленные вами выходы. У вашего пользовательского объекта facebook нет электронной почты, т.е. Nil, но у вашего пользовательского объекта есть электронная почта. Итак, nil == [email protected] — это ложь. Следовательно, тест не проходит   -  person Pramod Solanky    schedule 30.08.2015


Ответы (2)


Ваша фабрика User не полностью настраивает пользователя. Он создает следующий объект user:

#<User id: 105,
       email: "[email protected]",
       encrypted_password: "$2a$04$90uzEdbwfnq...",
       reset_password_token: nil,
       reset_password_sent_at: nil,
       remember_created_at: nil,
       sign_in_count: 0,
       current_sign_in_at: nil,
       last_sign_in_at: nil,
       current_sign_in_ip: nil,
       last_sign_in_ip: nil,
       created_at: "2015-08-30 04:12:59",
       updated_at: "2015-08-30 04:12:59",
       auth_token: "vkvm2-fLe5x1dZGbewqw",
       provider: nil,
       uid: "133290925"

Обратите внимание, что провайдером является nil. Таким образом, ваш метод from_facebook (который ищет uuid и провайдера) не может найти пользователя.

В качестве решения используйте следующее, чтобы создать свой existing_user в спецификации:

existing_user = FactoryGirl.create(:user, provider: 'facebook')
person tessi    schedule 30.08.2015

Вы устанавливаете uid в FactoryGirl.create(:user)?

Можете ли вы опубликовать содержимое вашей user фабрики? Возможно, вы захотите создать facebook_user фабрику, которая устанавливает уникальный uid

person Josh    schedule 30.08.2015
comment
спасибо @Josh, как упомянул @tessi, это произошло потому, что я не установил свойство :provider для user. - person ruwhan; 08.09.2015