2015-05-18 1 views
1

Я учусь RSpec и тестирование ниже сценарий:Ошибка "undefined method` <'for nil: NilClass "при тестировании модели с 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 

ниже определение Student модель:

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 

Пожалуйста, помогите. Спасибо.

+0

, но в моем тестовом примере я предоставляю значение рулона как 1 и 80. то как же студент.ролл приходит ноль –

+1

1. используйте проверку числовой валидации. 2. Не используйте 'self', где вы делаете - это избыточно. 3. Вы проверяете 'roll', но добавляете ошибки в' rollnumber'. 4. Не используйте 'или', но '' '' '' 'или' скорее для потока управления, а не для определения условий –

ответ

2

Вам не нужно добавлять пользовательскую проверку. Рассмотрите возможность использования numericality validation предоставленный ActiveRecord:

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 лучших практик.

+0

теперь он работает нормально ... но я все еще путаю, почему я получаю ошибку, если я не прохожу nil в поле числа рулонов. –

+0

Ваш код немного запутанный, вы используете имена рулонов и рулонов для того же, я не могу точно сказать, в чем проблема. Это ответ помог вам, подумайте о том, чтобы принять его как правильный ответ :) – alfakini

+0

да ответ мне помог .. во всяком случае, я принимаю ответ, но я надеялся ответить на мою настоящую проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^