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?

--
Posted via http://www.ruby-forum.com/.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Search Discussions

  • David Chelimsky at Mar 29, 2012 at 1:01 pm

    On Thu, Mar 22, 2012 at 7:23 AM, Fearless Fool wrote:
    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?
    I don't espouse stubbing or mocking associations, as it requires
    knowledge of Rails internals (as in your example). I do espouse
    stubbing domain-specific APIs on models in controller specs, because
    that provides fine-grained control of state and decoupling from the
    database, but that is an entirely different matter/context.

    HTH,
    David

    --
    You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
    To post to this group, send email to rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouprubyonrails-talk @
categoriesrubyonrails
postedMar 22, '12 at 12:24p
activeMar 29, '12 at 1:01p
posts2
users2
websiterubyonrails.org
irc#RubyOnRails

2 users in discussion

David Chelimsky: 1 post Fearless Fool: 1 post

People

Translate

site design / logo © 2021 Grokbase