2015-10-07 1 views
1

Я настраиваю пользовательскую проверку, которая проверяет, проголосовал ли пользователь за альбом перед отправкой обзора. Проверка достоверности выполняется на стороне клиента, но когда дело доходит до запуска моих тестов Rspec, я, похоже, сталкиваюсь с некоторыми проблемами.Выполнение пользовательских проверок с помощью специальных методов gem

В валидации используется метод Acts As Votable gem's voted_for?. К сожалению, здесь все плохо. Для моих без пользовательских проверок (которые работают регулярно кстати) я получаю сообщение об ошибке, как это:

3) Review validations should ensure body has a length of at least 40 
    Failure/Error: it { should validate_length_of(:body).is_at_least(40) } 
    NoMethodError: 
     undefined method `voted_for' for nil:NilClass 

Что мне нужно сделать для того, чтобы этот метод, чтобы быть признанным?

Обзор Модель

class Review < ActiveRecord::Base 
    belongs_to :album 
    belongs_to :owner, class_name: "User", foreign_key: :user_id 

    validates :body, presence: true, length: { minimum: 40 } 

    def album_vote 
    if !owner.voted_for?(album) 
     errors.add(:review, "requires an album vote before submitting") 
    end 
    end 
end 

Обзор Завод

FactoryGirl.define do 
    factory :review do 
    body { Faker::Lorem.paragraph(2) } 

    album 
    association :owner, factory: :user 
    end 
end 

ответ

0

Вы должны убедиться, что на самом деле является владельцем. Ошибка - это просто потому, что вы вызываете нуль и на самом деле не имеете никакого отношения к ActsAsVotable.

class Review < ActiveRecord::Base 
    belongs_to :album 
    belongs_to :owner, class_name: "User", foreign_key: :user_id 
    validates :body, presence: true, length: { minimum: 40 } 
    validates :owner, presence: true 

    def album_vote 
    # consider raising an error if there is no owner. 
    if owner && !owner.voted_for(album) 
     errors.add(:review, "requires an album vote before submitting") 
    end 
    end 
end 

А затем изменить определение фабрики для создания владельца:

FactoryGirl.define do 
    factory :user, aliases: [:owner] do 
    # ... 
    end 
end 

FactoryGirl.define do 
    factory :review do 
    body { Faker::Lorem.paragraph(2) } 
    album 
    owner 
    end 
end 
+0

Ошибка также может быть связано с тем, как вы ссылаетесь на заводе в тесте. – max

+0

Да, похоже, что необходимо проверить наличие ранее существовавшего «владельца» в условном выражении. Спасибо Макс! –

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