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

我正在尝试为User模型创建一个测试用例。 基本上,它将validationfirst_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  true validates :last_name, :presence => true end 

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 

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

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

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

 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