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

How to test before_create method with Rspec in rails 4

在我的用户模型中,我有一个为用户生成帐户 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

您的错误是由于拼写错误造成的:"undefined method" 表示您正在调用不存在的内容。在这种情况下,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 (see section "Using factories"), much like ActiveRecord's,不保存对象。因此,before_create 回调不会触发。