为什么rspec告诉我这个用户是有效的

时间:2012-08-25 04:15:30

标签: ruby-on-rails ruby-on-rails-3.1 rspec

我在Rails中有以下类,并且正在编写一些rspec测试(任何批评都非常受欢迎,因为我在rspec是一个nOOb)。

class User.rb

class User < ActiveRecord::Base

email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

validates :email, :presence   => true ,
                  :format     => { :with => email_regex },
                  :uniqueness => { :case_sensitive => true },
                  :on => :create
end

和在factory.rb

FactoryGirl.define do
  factory :user do
    sequence(:name) { |n| "my-name#{n}" }
    sequence(:email) { |n| "blue#{n}@12blue.com" }
  end
end

和我的rspec(users_spec.rb):

require 'spec_helper'

describe User do
  let(:user) { FactoryGirl.build(:user) }
  it { user.should be_valid }
  it { user.should be_a(User) }
  it { user.should respond_to(:email) }

  it { user.email = " " }
  it { user.should_not be_valid } # this is causing the error 
end

并获取

1) User 
     Failure/Error: it { user.should_not be_valid }
       expected valid? to return false, got true

但根据验证,用户不应该有效。这里发生了什么?我没有得到什么(我知道这是我的错)?

THX

1 个答案:

答案 0 :(得分:1)

我认为测试失败让您感到惊讶,因为您认为用户电子邮件应为" "

在rspec中,每个例子都是独立的。这意味着您在之前的示例中所做的任何事情都会被遗忘。

在您的情况下,您的倒数第二个示例运行,构建一个新的,有效的activerecord用户,其电子邮件为"blue4@12blue.com",用" "覆盖该电子邮件,然后通过,因为它没有断言。

然后您的最后一个示例运行,构建一个新的,有效的activerecord用户,其电子邮件是"blue5@12blue.com"并且由于用户有效而失败,因此该电子邮件尚未被覆盖。

你可能想要这样的东西:

it 'should validate the email' do
  user.email = " "
  user.should_not be_valid
end