【问题标题】:Error "undefined method `<' for nil:NilClass" when testing a model with RSpec.使用 RSpec 测试模型时出现错误“nil:NilClass 的未定义方法 `<'”。
【发布时间】:2015-05-18 11:14:01
【问题描述】:

我正在学习 RSpec 并测试以下场景:

require 'rails_helper'

RSpec.describe Student, type: :model do
  before(:each) do
    Student.delete_all
  end

  it "roll number can't be less than 0 or more than 80" do
    s = Student.create(:name => "sanjay" , :lastname => "test" , :roll => 0)
    s1 = Student.create(:name => "sanjay" , :lastname => "test" , :roll => 81)
    expect(s).not_to be_valid
    expect(s1).not_to be_valid
  end
end

以下是学生模型定义:

class Student < ActiveRecord::Base
  validates_presence_of :name
  validates_uniqueness_of :roll
  validate :number_of_valid_students
  def number_of_valid_students
    if (self.roll < 1)  or (self.roll > 80)
      self.errors.add(:rollnumber , "Can't be less than 0 or greater than 80")
    end
  end
end

运行命令rake spec:models 后出现以下错误:

 Failure/Error: expect(student).not_to be_valid
 NoMethodError:
   undefined method `<' for nil:NilClass

请帮忙。 谢谢。

【问题讨论】:

  • 但在我的测试用例中,我提供的滚动值为 1 和 80。那么 student.roll 怎么会为零
  • 1.使用数值验证。 2. 不要在你使用的地方使用self - 这是多余的。 3. 您正在检查roll,但将错误添加到rollnumber。 4. 不要使用or|| - or 是用于控制流,而不是用于定义条件

标签: ruby-on-rails ruby-on-rails-4 rspec rspec3


【解决方案1】:

您不需要添加自定义验证。考虑使用 ActiveRecord 提供的numericality validation

class Student < ActiveRecord::Base
  validates :name, presence: true
  validates :roll, uniqueness: true
  validates :roll, numericality: { greater_than: 1, less_than: 80 }
end

也可以这样写你的测试:

let(:student1) { Student.create(name: "sanjay", lastname: "test", roll: 0) }
let(:student2) { Student.create(name: "sanjay", lastname: "test", roll: 81) }

it "roll number can't be less than 0 or more than 80" do
  expect(student1).not_to be_valid
  expect(student2).not_to be_valid
end

查看Better Specs 了解 RSpec 最佳实践。

【讨论】:

  • 它现在工作正常......但我仍然很困惑,如果我没有将 nil 值传递给卷号字段,为什么会出现错误。
  • 您的代码有点混乱,您使用 roll 和 rollnumber 名称来表示同一件事,我不能确定是什么问题。如果答案对您有所帮助,请考虑接受它作为正确答案:)
  • 是的,答案对我有帮助。无论如何,我接受了答案,但我希望能解决我真正的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多