Hi

I'm struggling to find a neat way to spec this. The Sequel ORM doesn't support automatically destroying dependent models. It's easy enough to do in a callback though:

  class Changeset < Sequel::Model
    has_many :migrations, :class => DataModel::Migration

    before_destroy do
      migrations.each { |m| m.destroy }
    end

    # ...
  end

The problem is isolating it from the database to test. I want to know that when I send Changeset#destroy that each migration is destroyed. The implementation of Sequel::Model#destroy (from the RDoc) is this:

# File sequel/lib/sequel_model/record.rb, line 325
325: def destroy
326: db.transaction do
327: before_destroy
328: delete
329: after_destroy
330: end
331: self
332: end

Now, if a database isn't wired up, Sequel complains if you do anything database related, and that includes using associations. So the best I have so far is this:

  describe "#destroy" do
    before(:each) do
      # ...
      @changeset = DataModel::Changeset.new
    end

    it "should fire a before_destroy hook to destroy all Migrations" do
      class << @changeset
        def destroy
          before_destroy
        end
      end

      @changeset.stub!(:migrations).and_return(
        [EMAIL PROTECTED], @migration_2])

      @migration_1.should_receive(:destroy)
      @migration_2.should_receive(:destroy)

      @changeset.destroy
    end
  end

So I've committed these sins:
* redefined someone else's code, when I depend on the real version at runtime
* included an assumption about the external code in my stub
* stubbed out a method on the object under test

In sort, it's suckitude of the highest order. But I don't know how to do this without resorting to an in-memory SQLite database or something.

Any help much appreciated.

Ashley


--
http://www.patchspace.co.uk/
http://aviewfromafar.net/



_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to