Rspec测试未通过的新对象的有效性

时间:2012-09-27 14:56:15

标签: ruby-on-rails rspec factory-bot railstutorial.org

我完成了所有Michael Hartl的Ruby on Rails教程,所有测试都通过了。现在我要回去并根据自己的需要对网站进行更改,它并不像“本节中的测试没有通过”那样切割干燥。我创建了一个新的“慈善”对象,该对象强烈基于Hartl的“Micropost”对象。唯一的区别是,对象不是拥有“内容”,而是:name:description:summary

这是失败的测试代码(具体为“it {should be_valid}”),位于/charity_spec.rb

require 'spec_helper'

    describe Charity do

      let(:user) { FactoryGirl.create(:user) }
      before { @charity = user.charities.build(summary: "Lorem ipsum") }

      subject { @charity }

      it { should respond_to(:name) }
      it { should respond_to(:user_id) }
      it { should respond_to(:summary) }
      it { should respond_to(:description) }
      it { should respond_to(:user) }
      its(:user) { should == user }
      it { should be_valid }
      ...

测试实际上是先通过,但是一旦我将验证添加到charity.rb文件,它们就会返回;

 Failures:
   1) Charity
      Failure/Error: it { should be_valid }
         expected valid? to return, true, got false
         ...

这是charity.rb

class Charity < ActiveRecord::Base
  attr_accessible :name, :description, :summary
  belongs_to :user

  validates :name, presence: true, length: { maximum: 40 }
  validates :summary, presence: true
  validates :description, presence: true
  validates :user_id, presence: true

  default_scope order: 'charities.created_at DESC'
end

我确定这是愚蠢的,但我对一切的理解是如此的弱,我无法弄清楚我做错了什么,我的感觉是我的工厂出了问题,但我真的不知道

这是我的慈善工厂,位于factories.rb

factory :charity do
    name "Lorem ipsum"
    summary "Lorem ipsum"
    description "Lorem ipsum"
    user
end

当我从:name中删除:summary:descriptioncharity.rb验证后,测试通过。好的方法,这是user.rb的开头:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation 
  has_secure_password
  has_many :charities
  has_many :microposts, dependent: :destroy

1 个答案:

答案 0 :(得分:0)

使用你的工厂有一个合适的慈善机构:

before { @charity = user.charities.build(FactoryGirl.attributes_for(:charity)) }

它失败了,因为您验证了未设置为name

的属性的存在

如果您需要更多关于FactoryGirl的背景知识,他们的documentation非常好。