如何在rails 4中使用Rspec测试before_create方法

时间:2015-01-12 23:31:59

标签: ruby-on-rails ruby-on-rails-4 rspec

在我的用户模型中,我有一个为用户生成帐户ID的功能。我想写一个创建用户的测试(我正在使用FactoryGirl),然后检查以确保在保存用户后account_id字段不为空。 在我目前的测试中,我收到的错误如下:

NoMethodError: undefined method `to_not=' for #<RSpec>

user.rb

class User < ActiveRecord::Base
  before_create :generate_account_id

  private

    def generate_account_id
      self.account_id = loop do
        random_account_id = rand.to_s[2..6]
        break random_account_id unless self.class.exists?(account_id: random_account_id)
      end
    end
end

user_spec.rb

#spec/models/user_spec.rb
require 'spec_helper'
require 'rails_helper'

describe User do
  it "has a valid factory" do
    user = create(:user, :user)
    expect(user).to be_valid
  end

  it "receives a Account ID on successful create" do
    user = FactoryGirl.build(:user)
    expect(user.account_id).to_not == nil
  end
end

1 个答案:

答案 0 :(得分:1)

你的错误是由于一个错字:“未定义的方法”意味着你正在调用一些不存在的东西。在这种情况下,Ruby将您的.to_not ==调用解释为尝试分配。如果您选中the RSpec documentation for ==,则会发现它也使用be方法:

expect(user.account_id).to_not be == nil

或者,如果您use the be_nil matcher instead

,您的测试可能会更清晰
expect(user.account_id).to_not be_nil

此问题的另一个方面是您使用的是build,而不是createFactoryGirl's build method(请参阅“使用工厂”一节)与ActiveRecord's非常相似,不会保存对象。因此,before_create回调不会触发。