[英]RSpec test fails with NoMethodError
我有一個模型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
在我的domain_spec.rb
我試圖測試自定義驗證- 唯一用戶只能有3個域
require 'rails_helper'
RSpec.describe Domain, type: :model do
it " - cannot create a new domain if user already have 3 domains" do
user = User.create(name: "John Doe", email: 'jane@doe.com', password: 'pw1234',
password_confirmation: 'pw1234')
user_domain1 = Domain.create(name: 'http://example1.com', user_id: user.id,
created_at: DateTime.now, updated_at: DateTime.now)
expect(user_domain1.errors).to be_empty
user_domain2 = Domain.create(name: 'http://example2.com', user_id: user.id,
created_at: DateTime.now, updated_at: DateTime.now)
expect(user_domain2.errors).to be_empty
user_domain3 = Domain.create(name: 'http://example3.com', user_id: user.id,
created_at: DateTime.now, updated_at: DateTime.now)
expect(user_domain3.errors).to be_empty
user_domain4 = Domain.create(name: 'http://example4.com', user_id: user.id,
created_at: DateTime.now, updated_at: DateTime.now)
expect(user_domain4.errors).to_not be_empty
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 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的新手,請幫助我解決此問題。 提前致謝
查看錯誤消息:
[...] self.user.domains(:reload).count >= 3
NoMethodError: undefined method `domains' for nil:NilClass
這表明未保存user
,可能是由於某些驗證錯誤所致。 現在的挑戰是找出為什么驗證失敗,這樣你就可以修復它。
在測試代碼中,您將按照以下方式創建這些數據庫條目:
user = User.create(name: "John Doe", ...)
user_domain1 = Domain.create(name: 'http://example1.com', user_id: user.id, ...)
找出發生的錯誤的一種簡單方法是使用create!
而不是create
:
user = User.create!(name: "John Doe", ...)
user_domain1 = Domain.create!(name: 'http://example1.com', user_id: user.id, ...)
這樣,將引發RecordInvalid
異常,說明無法保存記錄的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.