Ruby on rails Rails代码验证工作正常,但Rspec测试失败

Ruby on rails Rails代码验证工作正常,但Rspec测试失败,ruby-on-rails,validation,ruby-on-rails-4,rspec,rspec-rails,Ruby On Rails,Validation,Ruby On Rails 4,Rspec,Rspec Rails,有人知道Rspec出了什么问题吗?我对无效电子邮件的所有测试都失败了(也就是说,它们应该是无效的,但在Rspec中不知何故是无效的),但在实际代码中,它工作正常,不允许任何不好的电子邮件。验证甚至可以在我的控制台中工作 注二: 我意识到格式不理想。。。我们稍后会处理这个问题。这只是我一个人写的东西,还没有经历和弄干 我还意识到,有一种更简单的方法可以在模型中单独验证这些内容,但我需要非常定制的消息,而不需要任何属性的引用,而且我不喜欢我读到的那种需要执行的迂回方式 型号代码 validate :

有人知道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-z\d\-]+(\.[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代码

    FactoryGirl.define do
      factory :signup do |f|
        f.email { Faker::Internet.email }
                #... other attributes
      end
    

    结束

    据我所知,您只在创建时验证代码!但在测试中,您在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或您可以在::create上删除选项