Rails 3.1 Rspec为Model创建测试用例验证字段

时间:2011-07-20 07:42:22

标签: ruby ruby-on-rails-3 testing rspec

我正在尝试为User模型创建一个测试用例。基本上,它将验证first_name和last_name是否存在。

我要做的是检查特定字段上的错误是否为空,它应该为空。然而它总是失败。

这样做的正确方法是什么?

这是我的代码

在我的user_spec.rb

require 'spec_helper'

describe User do

  before do
    @user = User.new
  end

  it "must have a first name" do
    @user.errors[:first_name].should_not be_empty
  end

  it "must have a last name" do
    @user.errors[:last_name].should_not be_empty
  end
end

在我的user.rb文件

class User < ActiveRecord::Base
  validates :first_name, :presence => true
  validates :last_name, :presence => true
end

2 个答案:

答案 0 :(得分:18)

您也可以通过简单地进行测试:

describe 'validations' do
  it { should validate_presence_of :firstname }
  it { should validate_presence_of :lastname  }
end

查看所有此类标准Rails验证的shoulda matchers。 这种方式不仅更简洁,而且还可以处理积极的情况。这意味着你不需要测试下面提到的场景:

it "passed validations when first_name is set"
  user = User.create(:firstname => 'f', :lastname => 'l')
  user.errors[:first_name].should be_empty
  user.errors[:last_name].should be_empty
end

答案 1 :(得分:16)

RSpec支持“隐含”主题的概念。如果您对“describe”块的第一个参数是一个类,则RSpec会自动使该类的实例可用于您的规范。请参阅http://relishapp.com/rspec/rspec-core/v/2-6/dir/subject/implicit-subject

require 'spec_helper'

describe User do

  it "must have a first name" do    
    subject.should have(1).error_on(:first_name)
  end

  it "must have a last name" do
    subject.should have(1).error_on(:last_name)
  end
end

导致RSpec输出(如果使用--format文档):

User
  must have a first name
  must have a last name

如果您满足于RSpec输出默认值,则可以进一步缩写:

require 'spec_helper'

describe User do
  it { should have(1).error_on(:first_name) }
  it { should have(1).error_on(:last_name) }
end

导致:

User
  should have 1 error on :first_name
  should have 1 error on :last_name
相关问题