i am trying to test some callback before_save logic. But i am stack in this dark place where i cant figure out solution.

I have this method which updates some attributes before save:

def order_item_positions
    Place.item_positions_reorder(item_position, city_id).each do |place|
      new_item_position = place.item_position + 1
      place.update_attributes(item_position: new_item_position)
    end
  end

What that method does, is changes all records above to +1 position! and than i want to test it using rspec something like this:

describe "places order" do
    let(:city){FactoryGirl.create(:city)}
    let(:place){FactoryGirl.create(:place, city_id: city.id)}
    let(:place_sec){FactoryGirl.create(:place, city_id: city.id)}

    context "when placed before other record" do
      it "should be placed before" do
        place_sec.item_position = 1
        place.item_position = 1
        expect{
          ...somehow saving and triggering callback! //dont know how to do that :/
        }.to change(place_sec, :item_position).from(1).to(2)
      end
    end
  end

Any help would be much appreciated! :)

有帮助吗?

解决方案

You should build model and then save it, i think:

describe "places order" do
  let!(:city) { FactoryGirl.create(:city) }
  let!(:place) { FactoryGirl.create(:place, city_id: city.id) }
  let!(:place_sec) { FactoryGirl.build(:place, city_id: city.id) }

  context "when placed before other record" do
    it "should be placed before" do
      place_sec.item_position = 1
      place.item_position = 1
      expect(place_sec.save).to change(place_sec, :item_position).from(1).to(2)
    end
  end
end

You didn't mention in what model you have this before_save method order_item_positions. So what should you save to call it. Just build this model, and then save.

其他提示

A simple call to .save should do it: expect{ place_sec.save }.to change(place_sec, :item_position).from(1).to(2)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top