2014-12-09 3 views
2

Я новичок в Rails, и я пытаюсь посмотреть в свой объект, чтобы узнать, истинно ли значение, чтобы проверить все остальные элементы в объекте. Я уверен, что если пользователь является пользователем, подтвердите имя и адрес электронной почты в приложении/модели. Каков наилучший способ написать спецификацию для этого?Rails 4 model rspec for if conditional

class Members < ActiveRecord::Base 
    validates_presence_of :email, if: :is_user? 
    validates_presence_of :first_name, if: :is_user? 
    validates_presence_of :last_name, if: :is_user? 

    def is_user? 
     :is_user 
    end 
end 
+0

is_user - это поле в базе данных. –

ответ

2

У вас есть поле с именем «is_user» в таблице участников? Кажется, что метод должен возвращать логическое значение (истина или ложь), а теперь она возвращает символ, который всегда будет оцениваться истина, в качестве примера, если вы

if :is_user 
    puts "will always happen" # this will be printed 
end 

Если поле в базе данных, то нет необходимости создавать этот метод, поскольку рельсы генерируют методы с вопросительным знаком для всех логических полей в базе данных модели.

Теперь, чтобы проверить, что вы можете использовать камень как shoulda_matchers или вы можете написать свои собственные тесты, как

describe "validations" do 
    context "member is a user" do 
    subject { Member.new(is_user: true) } 

    it "validates presence of email" do 
     subject.valid? 
     expect(subject.errors["email"]).to include("can't be blank") 
    end 
    end 

    context "member is not an user" do 
    subject { Member.new(is_user: false) } 

    it "doesn't require fields to have info" do 
     subject.valid? 
     expect(subject.errors["email"]).to_not include("can't be blank") 
     expect(subject.errors["first_name"]).to_not include("can't be blank") 
     expect(subject.errors["last_name"]).to_not include("can't be blank") 
    end 
    end 
end 
+0

Да, это логическое значение. Так что мне нужно сделать что-то другое для файла модели приложения? или что я в настоящее время приемлемо? –

+0

, если это логическое значение, которое вы имеете в поле 'is_user' в db, затем удалите этот метод, иначе он всегда будет true, и эти проверки будут всегда выполняться. Если это то, что вы хотите, вы можете удалить этот метод и часть 'if: ...' в объявлении валидации. – rafb3

+0

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

2

Вы должны использовать shouda matchers было бы сортировать и довольно:
Пример взят из здесь Shoulda/RSpec matchers - conditional validation

context "if user" do 
    before { subject.stub(:is_user?) { true } } 
    it { should validate_presence_of(:name) } 
    it { should validate_presence_of(:email) } 
end 

context "if not user" do 
    before { subject.stub(:is_user?) { false } } 
    it { should_not validate_presence_of(:name) } 
    it { should validate_presence_of(:email) } 
end