Mocking a reference to a polymorphic model?

The basic question: how do you mock a reference to a polymorphic class
in RSpec? Trying the obvious thing leads to an error of the form:

undefined method `base_class’ for Post:Class

=== The details:

file: app/models/relation.rb

class Relation < ActiveRecord::Base
belongs_to :entity, :polymorphic => true
end

file: db/xxx_create_relations.rb

class CreateRelations < ActiveRecord::Migration
def change
create_table :relations do |t|
t.references :entity, :polymorphic => true, :null => false
end
end
end

file: spec/models/relation_spec.rb

describe Relation do
it ‘should create instance without error’ do
post = mock_model(“Post”)
lambda { Relation.create!(:entity => @post)}.should_not raise_error
end
end

=== Running the test:

  1. Relation should create instance without error
    Failure/Error: lambda { Relation.create!(:entity => post)
    }.should_not raise_error
    expected no Exception, got #<NoMethodError: undefined method
    `base_class’ for Post:Class>

    ./spec/models/relation_spec.rb:39:in `block (2 levels) in <top

(required)>’

My hunch is that ActiveRecord is calling base_class on the mocked model
(Post) to determine what to stick in the ‘entity_type’ column in the
relations table. I tried explicitly setting it, as in:

post = mock_model("Post", :base_class => "Post")

but the error was the same.

For all the reasons that DC espouses, I’d love to mock references to the
polymorphic models, but I don’t see how to do that.

Any ideas?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs