Ruby on rails RSpec测试因NoMethodError而失败

Ruby on rails RSpec测试因NoMethodError而失败,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我有一个模型domain.rb class Domain < ActiveRecord::Base belongs_to :user has_many :ranks, dependent: :destroy validates_uniqueness_of :name, scope: :user_id, message: "You alredy entered that domain" validates_presence_of :name validate :user

我有一个模型
domain.rb

class Domain < ActiveRecord::Base
  belongs_to :user
  has_many :ranks, dependent: :destroy

  validates_uniqueness_of :name, scope: :user_id, message: "You alredy entered that domain"
  validates_presence_of :name
  validate :user_quota, on: :create

  def user_quota
    errors.add(:base, 'OOps!!! You have Exceeded maximum domain limit/user (3)')  if self.user.domains(:reload).count >= 3
  end
end
class User < ActiveRecord::Base
  has_many :domains
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable, :zxcvbnable

  # Override Devise method to send mails in background
  def send_devise_notification(notification, *args)
    devise_mailer.send(notification, self, *args).deliver_later
  end
end
运行我的测试
rspec spec/models/domain_spec.rb
时,我遇到错误:

域-如果用户已经有3个域,则无法创建新域

 Failure/Error: errors.add(:base, 'OOps!!! You have Exceeded maximum
 domain limit/user (3)')  if self.user.domains(:reload).count >= 3
 NoMethodError: undefined method `domains' for nil:NilClass
我的
user.rb

class Domain < ActiveRecord::Base
  belongs_to :user
  has_many :ranks, dependent: :destroy

  validates_uniqueness_of :name, scope: :user_id, message: "You alredy entered that domain"
  validates_presence_of :name
  validate :user_quota, on: :create

  def user_quota
    errors.add(:base, 'OOps!!! You have Exceeded maximum domain limit/user (3)')  if self.user.domains(:reload).count >= 3
  end
end
class User < ActiveRecord::Base
  has_many :domains
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable, :zxcvbnable

  # Override Devise method to send mails in background
  def send_devise_notification(notification, *args)
    devise_mailer.send(notification, self, *args).deliver_later
  end
end
class用户

我做错了什么?我是RSpec的新手,请帮我解决这个问题。提前感谢查看错误消息:

[...] self.user.domains(:reload).count >= 3
  NoMethodError: undefined method `domains' for nil:NilClass
这表示未保存
用户
,可能是由于某些验证错误。现在的挑战是找出验证失败的原因,以便您能够修复它

在测试代码中,您将创建以下数据库条目:

user = User.create(name: "John Doe", ...)
user_domain1 = Domain.create(name: 'http://example1.com', user_id: user.id, ...)
一种简单的方法是使用以下命令来确定发生了什么错误,从而使您的测试失败,并显示一条更有用的消息:


这样做,将引发一个
RecordInvalid
异常,说明无法保存记录的原因。

您是否将
has_many:domains
添加到您的
用户
模型中?@Uzbekjon是的,我在User.rb中有
has_many:domains
与您遇到的错误没有直接关系,但是
:reload
self.user.domains(:reload).count
中应该做什么?在创建域时尝试分配整个用户对象,而不仅仅是id.
Domain.create(user:user)
为了简化测试,您可能希望使用的其他方法是通过工厂模式创建数据,例如使用(和
factory\u girl\u rails
)。