The basic question: how do you mock (or stub) 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 (or stub) references to the polymorphic models, but I don't see how to do that. Any ideas?