use*_*677 4 ruby testing rspec ruby-on-rails-3
我正在尝试为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
Run Code Online (Sandbox Code Playgroud)
在我的user.rb文件上
class User < ActiveRecord::Base
validates :first_name, :presence => true
validates :last_name, :presence => true
end
Run Code Online (Sandbox Code Playgroud)
jak*_*ake 18
您也可以通过简单地进行测试:
describe 'validations' do
it { should validate_presence_of :firstname }
it { should validate_presence_of :lastname }
end
Run Code Online (Sandbox Code Playgroud)
查看所有此类标准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
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
这导致RSpec输出(如果使用--format文档):
User
must have a first name
must have a last name
Run Code Online (Sandbox Code Playgroud)
如果您对RSpec输出默认值满意,可以进一步缩写:
require 'spec_helper'
describe User do
it { should have(1).error_on(:first_name) }
it { should have(1).error_on(:last_name) }
end
Run Code Online (Sandbox Code Playgroud)
这导致:
User
should have 1 error on :first_name
should have 1 error on :last_name
Run Code Online (Sandbox Code Playgroud)