繁体   English   中英

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

[英]Rails 3.1 Rspec Creating test case validate field for Model

我正在尝试为用户 model 创建一个测试用例。 基本上,它将验证 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

您也可以通过简单地执行以下操作进行测试:

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

查看所有此类标准 Rails 验证的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

RSpec 支持“隐式”主题的概念。 如果“describe”块的第一个参数是 class,则 RSpec 会自动使该 class 的实例适用于您的规范。 请参阅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 output (如果使用 --format 文档):

User
  must have a first name
  must have a last name

如果您对 RSpec output 默认值感到满意,您可以进一步缩写它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM