RoR,RSpec - 验证测试的问题

时间:2010-08-31 10:07:15

标签: ruby-on-rails validation activerecord rspec

通过rspec(我正在使用rspec-1.3.0,rspec-rails-1.3.2 gems)生成器(ruby script/generate rspec_model suggestion section_id:integer user_id:integer subject:string content:text state:string type:string)我创建了模型和模型规范并运行rake db:migrate and rake:test:prepare

之后我开始研究我的模型规范:

require 'spec_helper'

describe Suggestion do
  before(:each) do
    @valid_attributes = {
      :section_id => 1,
      :user_id => 1,
      :subject => 'Inappropriate title',
      :content => 'The title of this section is inappropriate.',
      :state => 'new',
      :type => 'flag'
    }
  end

  it "should create a new instance given valid attributes" do
    Suggestion.create!(@valid_attributes)
  end

  it "should reject empty section_id attribute" do 
    empty_section_id_suggestion = Suggestion.new(@valid_attributes.merge(:section_id => ""))
    empty_section_id_suggestion.should_not be_valid
  end

  ...

除了第一次"should create a new instance given valid attributes"测试外,我创建了6个测试,基本上建议模型的每个测试属性都是空的 - 几乎与"should reject empty section_id attribute"示例完全相同。

当我运行测试时,我得到了6次失败的测试,这很好。第一次测试"should create a new instance given valid attributes"通过。

现在,当我转到建议模型并添加validates_presence_of :all时,我收到以下与第一次测试相关的错误消息:

ActiveRecord::RecordInvalid in 'Suggestion should create a new instance given valid attributes'
Validation failed: All can't be blank
./spec/models/suggestion_spec.rb:16:

当我尝试单独运行测试(validates_presence_of :attribute)时,所有测试都通过,只有:type属性我再次收到类似的错误消息:

ActiveRecord::RecordInvalid in 'Suggestion should create a new instance given valid attributes'
Validation failed: Type can't be blank
./spec/models/suggestion_spec.rb:16:

之前我没有遇到过这个问题(有多个相似的模型及其规格正确传递)。看起来它有:type属性的问题(它说它不能为空),即使我通过@valid_attributes传递值。我尝试过谷歌搜索,但没有找到类似的问题/解决方案。

以下是测试:type属性

it "should reject empty type attribute" do 
        empty_type_suggestion = Suggestion.new(@valid_attributes.merge(:type => ""))
        empty_type_suggestion.should_not be_valid
  end

请检查一下,让我知道我在这里做错了什么。

非常感谢您的帮助

彼得

2 个答案:

答案 0 :(得分:1)

在您的模型中,您只能说验证:所有因为:所有都不是列名。

class Suggestion < AR::Base
  validates_pressence_of :subject, :content
end

没有理由验证id列的存在,但我想如果你愿意的话可以。

api文档: http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

答案 1 :(得分:1)

所以最后我找到了与:type属性相关的问题的答案:

http://www.gyrotechie.com/2008/09/activerecord-does-not-like-attributes-called-type/

问题是类型是从ActiveRecord继承的类的保留字段名称

我通过迁移重命名了字段名称并修改了所有相关文件,现在所有文件都正常运行。