如何在 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
,而不是 create
。 FactoryGirl's build method (see section "Using factories"), much like ActiveRecord's,不保存对象。因此,before_create
回调不会触发。
在我的用户模型中,我有一个为用户生成帐户 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
,而不是 create
。 FactoryGirl's build method (see section "Using factories"), much like ActiveRecord's,不保存对象。因此,before_create
回调不会触发。