Rspec Class 方法的测试总是失败

Rspec Test Always Failed for Class Method

正如题主所说。似乎实现的代码总是 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: "karolann.gulgowski@satterfield.us"
        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: "karolann.gulgowski@satterfield.us", encrypted_password: "auzEdbwfnqfUL0CDhNOH.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: "a$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">

请告诉我这里有什么问题。提前致谢。

您是否在 FactoryGirl.create(:user) 中设置 uid

你能post你的user工厂的内容吗?您可能想要创建一个 facebook_user 工厂来设置唯一的 uid

您的 User 工厂没有完全设置用户。它创建以下 user 对象:

#<User id: 105,
       email: "karolann.gulgowski@satterfield.us",
       encrypted_password: "auzEdbwfnq...",
       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')