Rspec and Rails 3 - Problem Validating Nested Attribute Collection Size
Posted
by
MunkiPhD
on Stack Overflow
See other posts from Stack Overflow
or by MunkiPhD
Published on 2010-12-27T03:52:31Z
Indexed on
2010/12/27
3:53 UTC
Read the original article
Hit count: 180
When I create my Rspec tests, I keep getting a validation of false as opposed to true for the following tests. I've tried everything and the following is the measly code that I have now - so if it's waaaaay wrong, that's why.
class Master < ActiveRecord::Base
attr_accessible :name, :specific_size
# Associations ----------------------
has_many :line_items
accepts_nested_attributes_for :line_items,
:allow_destroy => true,
:reject_if => lambda { |a| a[:item_id].blank? }
# Validations -----------------------
validates :name,
:presence => true,
:length => {:minimum => 3, :maximum => 30}
validates :specific_size,
:presence => true,
:length => {:minimum => 4, :maximum => 30}
validate :verify_items_count
def verify_items_count
if self.line_items.size < 2
errors.add(:base, "Not enough items to create a master")
end
end
end
And here it the items model:
class LineItem < ActiveRecord::Base
attr_accessible :specific_size, :other_item_type_id
# Validations --------------------
validates :other_item_type_id,
:presence => true
validates :master_id,
:presence => true
validates :specific_size,
:presence => true
# Associations ---------------------
belongs_to :other_item_type
belongs_to :master
end
The RSpec Tests:
before(:each) do
@master_lines = []
@master_lines << LineItem.new(:other_item_type_id => 1, :master_id => 2, :specific_size => 1)
@master_lines << LineItem.new(:other_item_type_id => 2, :master_id => 2, :specific_size => 1)
@attr = {:name => "Some Master", :specific_size => "1 giga"}
end
it "should create a new instance given a valid name and specific size" do
@master = Master.create(@attr)
line_item_one = @master.line_items.build(:other_item_type_id => 1, :specific_size => 1)
line_item_two = @master.line_items.build(:other_item_type_id => 2, :specific_size => 2)
@master.line_items.size === 2
@master.should be_valid
end
it "should have at least two items to be valid" do
master = Master.new(:name => "test name", :specific_size => "1 mega")
master_item_one = LineItem.new(:other_item_type_id => 1, :specific_size => 2)
master_item_two = LineItem.new(:other_item_type_id => 2, :specific_size => 1)
master.line_items << master_item_one
master.should_not be_valid
master.line_items << master_item_two
master.line_items.size.should === 2
master.should be_valid
end
I'm very new to Rspec and Rails - and I've been failing at this for the past couple of hours. Thanks for any help in advance.
© Stack Overflow or respective owner