簡體   English   中英

RSpec測試失敗,並顯示NoMethodError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM