我在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
答案 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