0

我正在为应用程序编写测试并遇到问题。

我的模型有下一个验证:

  def correct_date
    errors.add(:occured_at, 'must be in past or present time') if occured_at > 5.minutes.from_now
  end

当我在模型上运行最简单的测试时,它们都会失败。

  describe 'associations' do
    it { should belong_to(:category).optional }
  end

我收到一个错误:

     Failure/Error: errors.add(:occured_at, 'must be in past or present time') if occured_at > 5.minutes.from_now
     
     NoMethodError:
       undefined method `>' for nil:NilClass
4

1 回答 1

2

默认情况下,该测试将通过一个简单的Model.new调用创建一个新对象(Model正在测试的模型类在哪里)。在您的情况下,Model.new不会产生有效的对象,因此您需要告诉 Rspec 用于这些测试的主题:

describe 'associations' do
  subject { FactoryBot.create(:whatever_the_factory_is_called) }

  it { should belong_to(:category).optional }
end

您还应该修复您的correct_date验证方法来处理occurred_at.nil?;要么验证它nil不在correct_date

def correct_date
  if(occurred_at.nil?)
    # complain
  elsif(occurred_at > 5.minutes.from_now)
    errors.add(:occured_at, 'must be in past or present time')
  end
end

或单独验证存在并跳过>when occurred_at.nil?

validates :occurred_at, presence: true

def correct_date
  errors.add(:occured_at, 'must be in past or present time') if occurred_at && occured_at > 5.minutes.from_now
end

occurred_at在数据库中创建列也是not null可取的。

如果occurred_at确实是可选的,那么您只需要更新correct_date即可考虑occurred_at.nil?

def correct_date
  errors.add(:occured_at, 'must be in past or present time') if occurred_at && occured_at > 5.minutes.from_now
end
于 2020-11-13T17:10:26.460 回答