1

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

类用户.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

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

谢谢

4

1 回答 1

1

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

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

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

然后您的最后一个示例运行,构建一个新的、有效的 activerecord 用户,该用户的电子邮件是"blue5@12blue.com"并且失败,因为用户是有效的,它的电子邮件没有被覆盖。

你可能想要这样的东西:

it 'should validate the email' do
  user.email = " "
  user.should_not be_valid
end
于 2012-08-25T04:29:36.383 回答