#ruby-on-rails #validation #ruby-on-rails-4 #rspec #rspec-rails
#ruby-on-rails #проверка #ruby-on-rails-4 #rspec #rspec-rails
Вопрос:
Кто-нибудь может увидеть, что не так с Rspec? Все мои тесты на недопустимые электронные письма терпят неудачу (т. Е. Они должны быть недействительными, но каким-то образом находятся в Rspec), но в реальном коде все работает нормально, плохие электронные письма не допускаются. Проверка работает даже в моей консоли….
Два примечания:
- Я понимаю, что форматирование не идеально… будем работать над этим позже. Это был просто я, который писал вещи по отдельности, еще не пройдя и не высушив его.
- Я также понимаю, что существует более простой способ проверки этих вещей по отдельности в модели, но я хотел очень пользовательские сообщения без какой-либо ссылки на атрибут, и мне не понравился обходной путь, который, как я прочитал, необходимо выполнить.
Код модели
validate :create_validation, on: :create
def create_validation
errors[:base] << "Please enter a valid email address to continue" if self.email.blank? || (( /A[w -.] @[a-zd-] (.[a-z] )*.[a-z] z/i =~ self.email) == nil)
end
#The RegEx is from Michael Hartl's tutorial
Код спецификации
describe Signup do
before do
@signup = FactoryGirl.create(:signup)
end
subject { @signup }
describe "email tests" do
describe "invalid tests" do
# blank email
before { @signup.email = " " }
it { should_not be_valid }
# invalid format email
addresses = %w[user@foo..com, user@foo,com user_at_foo.org example.user@foo. foo@bar_baz.com foo@bar baz.com]
addresses.each do |invalid_address|
before { @signup.email = invalid_address }
it { should_not be_valid }
end
end
end
end
Код Factory girl в spec helper
FactoryGirl.define do
factory :signup do |f|
f.email { Faker::Internet.email }
#... other attributes
end
завершение
Ответ №1:
Как я понял, код вы проверяете только при создании! Но в тестах вы создали объект в блоке before, и он сохраняется в ваших тестах, поэтому проверка пропускается.
Попробуйте этот вариант
describe Signup do
before do
@signup = FactoryGirl.build(:signup)
end
subject { @signup }
describe "email tests" do
describe "invalid tests" do
# blank email
before { @signup.email = " " }
it { should_not be_valid }
# invalid format email
addresses = %w[user@foo..com, user@foo,com user_at_foo.org example.user@foo. foo@bar_baz.com foo@bar baz.com]
addresses.each do |invalid_address|
before { @signup.email = invalid_address }
it { should_not be_valid }
end
end
end
end
Я надеюсь, что проверка будет запущена для встроенной, но не сохраненной записи.
PS Или вы можете удалить опцию on: :create