在具有公司模型的简单rails应用程序中
class Company < ActiveRecord::Base
# Attributes
attr_accessible :name
validates_presence_of :name
def name=(s)
self[:name] = s.upcase
end
end
运行以下spec文件时。它失败。
require 'spec_helper'
describe Company do
before :each do
@company = Company.new({name: 'my_company'})
end
it "should validate presence of name" do
@company.should validate_presence_of(:name)
end
end
调试显示name =(s)方法被调用两次,一次使用&#39; my_company&#39;一次只有零。
我不明白为什么第二次电话会发生在尼尔身上。 这是使用的宝石:
gem 'rails', '3.2.13'
gem 'mysql2'
group :development, :test do
gem 'rspec-rails', '2.11.0'
gem 'shoulda-matchers', :require => false
end
答案 0 :(得分:1)
应该用来写一个衬里规格,如文件中提到的那样
它{should validate_presence_of(:name)}
它{should validate_presence_of(:name).with_message(/不是可选的/)}
因此,您可以按照以下更具可读性的方式编写规范:
describe 'validations' do it {should validate_presence_of(:name)} end
关于名称字段的两个作业的问题:
答案 1 :(得分:0)
原因可能是你在新的name
方法中提到了name
。
最好使用write_attribute
方法作为您引用的文档。
将其读作:
def name=(s)
write_attribute(:name, s.upcase)
end