Проверка кода Rails работает, но тесты Rspec не выполняются

#ruby-on-rails #validation #ruby-on-rails-4 #rspec #rspec-rails

#ruby-on-rails #проверка #ruby-on-rails-4 #rspec #rspec-rails

Вопрос:

Кто-нибудь может увидеть, что не так с Rspec? Все мои тесты на недопустимые электронные письма терпят неудачу (т. Е. Они должны быть недействительными, но каким-то образом находятся в Rspec), но в реальном коде все работает нормально, плохие электронные письма не допускаются. Проверка работает даже в моей консоли….

Два примечания:

  1. Я понимаю, что форматирование не идеально… будем работать над этим позже. Это был просто я, который писал вещи по отдельности, еще не пройдя и не высушив его.
  2. Я также понимаю, что существует более простой способ проверки этих вещей по отдельности в модели, но я хотел очень пользовательские сообщения без какой-либо ссылки на атрибут, и мне не понравился обходной путь, который, как я прочитал, необходимо выполнить.

Код модели

 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