在我的用户模型中,我有一个为用户生成帐户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
答案 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
,而不是create
。 FactoryGirl's build method(请参阅“使用工厂”一节)与ActiveRecord's非常相似,不会保存对象。因此,before_create
回调不会触发。