如何在rspec中测试返回模型实例的类方法

时间:2016-07-15 18:59:03

标签: ruby-on-rails rspec factory-bot

我正在尝试测试我的用户模型的类方法#registered_but_not_logged_in(email),该方法抓取第一个用户,该用户匹配具有confirmed_at条目但从未登录的电子邮件(我用sign_in_count来计算。我使用rspec和Factorygirl,再加上shoulda-matchers v2.8。

这是红宝石:

def self.registered_but_not_logged_in email
  self.with_email( email ).confirmed.never_signed_in.first
end 

我已经在Rails控制台中对此进行了测试,我知道它按预期工作,所以这不是一个逻辑问题,所以我在想我做错了什么在我的测试中:

describe User do
  # create @user

  describe ".registered_but_not_logged_in" do
    it "returns a user that matches the provided email who is confirmed, but who has not yet signed in" do
      @user.confirmed_at = 2.days.ago
      @user.email = "fisterroboto5893@mailinator.com"

      result = described_class.registered_but_not_logged_in("fisterroboto5893@mailinator.com")
      expect(result).to be_instance_of(User)
    end
  end

在此示例中,result为零。我知道这是@user存在于数据库外的情况,而方法是主动检查数据库,但我不知道如何在使用rspec / factorygirl时处理这个问题。任何帮助都绝对值得赞赏!

1 个答案:

答案 0 :(得分:0)

所以我不能100%确定为什么我正在做的事情正在发挥作用,但这是我在@nort和我的同事的帮助下偶然发现的解决方案:

it "returns a user that matches the provided email who is confirmed, but who has not yet signed in" do
  @user.confirmed_at = 2.days.ago
  @user.email = "fisterroboto5893@mailinator.com"
  @user.sign_in_count = 0
  @user.save!
  expect(User.registered_but_not_logged("fisterroboto5893@mailinator.com")).to be_instance_of(User)
end

我相信正在发生的是拯救!正在将@user保存到测试数据库,否则当我针对不同的数据库开发时,该数据库完全没有填充。问题当然是我们无法测试不存在的数据。

作为奖励,请注意expect()。to ...是rpsec的首选约定。另外,described_class我认为完全正常,但我现在更喜欢明确,因为我还在学习这些东西。