Re: [rspec-users] mocking a reference to a polymorphic model?

2012-03-22 Thread Chris Habgood
Are you really sure you need a polymorphic table?

On Thu, Mar 22, 2012 at 12:27, Fearless Fool li...@ruby-forum.com wrote:

 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?

 --
 Posted via http://www.ruby-forum.com/.
 ___
 rspec-users mailing list
 rspec-users@rubyforge.org
 http://rubyforge.org/mailman/listinfo/rspec-users




-- 
*In matters of style, swim with the current; in matters of principle,
stand like a rock.
Thomas Jefferson
*
___
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Re: [rspec-users] mocking a reference to a polymorphic model?

2012-03-22 Thread Matt Wynne

On 22 Mar 2012, at 17:27, Fearless Fool wrote:

 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.

Can you enumerate those reasons? This doesn't seem like a good use-case for 
mock_model, to me.

cheers,
Matt

--
Freelance programmer  coach
Author, http://pragprog.com/book/hwcuc/the-cucumber-book
Founder, http://www.relishapp.com/
Twitter, https://twitter.com/mattwynne


___
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users