2012-01-20 42 views
5

Tôi đang cố gắng kiểm tra thuộc tính {: _destroy = "1"} trên accept_nested_attributes_for trên liên kết has_many của tôi.thử nghiệm _destroy thuộc tính trên các thuộc tính lồng nhau bằng cách sử dụng RSpec trong Rails 3

Tôi đã làm việc đó cho một liên kết has_one, nhưng tôi không thể tìm ra cách để làm điều đó cho has_many.

Tìm kiếm lời khuyên! Thanks ^^ Bến

 describe "nested attributes" do 

     describe "cell phone" do # the has_one association 
      it "accepts nested cell phone" do 
      contact = FactoryGirl.create(:contact) 
      contact.build_cell_phone(FactoryGirl.build(:cell_phone, :contact => contact).attributes) 
      lambda { 
       contact.save 
      }.should change(CellPhone, :count).by(1) 
      end 
      it "allows destroy attribute" do 
      contact = FactoryGirl.create(:contact) 
      cell_phone_attributes = FactoryGirl.build(:cell_phone, :contact => contact).attributes 
      contact.build_cell_phone(cell_phone_attributes) 
      contact.save 
      contact.cell_phone.should be_kind_of(CellPhone) 
      cell_phone_attributes.merge({:_destroy => "1"}) 
      lambda { 
       contact.cell_phone_attributes = cell_phone_attributes 
      }.should change(CellPhone, :count).from(1).to(0) 
      end 
      it "rejects a cell phone with a blank number" do 
      contact = FactoryGirl.create(:contact) 
      contact.build_cell_phone(FactoryGirl.build(:cell_phone, :contact => contact, :number => "").attributes) 
      lambda { 
       contact.save 
      }.should_not change(CellPhone, :count) 
      end 
      it "rejects a cell phone with a blank cell provider" do 
      contact = FactoryGirl.create(:contact) 
      contact.build_cell_phone(FactoryGirl.build(:cell_phone, :contact => contact, :cell_provider_id => "").attributes) 
      lambda { 
       contact.save 
      }.should_not change(CellPhone, :count) 
      end 
     end 

     describe "jobs" do # the has_many association 
      it "accepts nested jobs" do 
      contact = FactoryGirl.create(:contact) 
      contact.jobs_attributes = 3.times.collect { FactoryGirl.build(:job, :contact => contact).attributes } 
      lambda { 
       contact.save 
      }.should change(Job, :count).by(3) 
      end 
      xit "allows destroy attribute" do # TODO skipped test 
      contact = FactoryGirl.create(:contact) 
      jobs_attributes = 3.times.collect { FactoryGirl.build(:job, :contact => contact).attributes } 
      contact.jobs_attributes = jobs_attributes 
      contact.save 
      contact.jobs.count.should == 3 
      # these are the old jobs_attributes, there is no jobs_attributes getter method on Contact! 
      jobs_attributes = jobs_attributes.each.collect { |hash| hash.merge({:_destroy => "1"}) } 
      lambda { 
       # this doesn't work, the attributes are from before the jobs were created 
       contact.jobs_attributes = jobs_attributes 
       contact.save 
      }.should change(Job, :count).from(3).to(0) # this fails, Job.count == 3 after the test 
      end 
     end 
     end 

Trả lời

0

Bạn có đi qua các tùy chọn :allow_destroy => true-accepts_nested_attributes_for?

Nó sẽ trông giống như:

class Contact 
    accepts_nested_attributes_for :jobs, :allow_destroy => true 
end 
Các vấn đề liên quan