[rspec-users] Problem testing method

Matt Wynne matt at mattwynne.net
Wed Sep 24 09:23:22 EDT 2008


On 24 Sep 2008, at 13:35, Carlos Rafael Belizón Ibáñez wrote:

> Hi, I have one problem testing one method to learn rSpec. This is the
> example
>
> #foo.rb
>
> class Foo < ActiveRecord::Base
>   has_one :bar
>
>   def foo
>     @bar.bar -= - 1
>   end
> end
>
>
> #bar.rb
> class Bar < ActiveRecord::Base
> end
>
>
> #foo_spec.rb
> require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
>
> describe Foo do
>   before(:each) do
>     @bar = mock_model(Bar, :bar= => 1)
>     @foo = Foo.new(:bar => @bar)
>     @before_value = @foo.bar
>   end
>
>   it "should foo" do
>     @foo.foo.should be_equal(@value_before - 1)
>   end
> end
>
>
> I got this error:
>
> 1)
> Spec::Mocks::MockExpectationError in 'Foo should foo'
> Mock 'Bar_1001' received unexpected message :bar with (no args)
> /home/carlos/NetBeansProjects/prueba/app/models/foo.rb:5:in `foo'
> /home/carlos/NetBeansProjects/prueba/spec/models/foo_spec.rb:11:
>
> How can I do this test using mocks?

try using stub_model instead of mock_model when you create @bar

If you create a mock object using mock_model(), or mock(), you have  
to stub or mock absolutely all the interactions it will have with the  
class under test. In this case, when you call Foo#foo, it calls the  
#bar method on your mock Bar, which hasn't been set up to expect that  
call.

So either use stub_model(Bar), which will create an instance of your  
concrete Bar class (and will therefore more likely know what to do  
when #bar is called), or remember to call @bar.stub!("bar-=") or  
whatever.

Make sense?

>
> Thanks ;).
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

cheers,
Matt
----
http://blog.mattwynne.net
http://songkick.com

In case you wondered: The opinions expressed in this email are my own  
and do not necessarily reflect the views of any former, current or  
future employers of mine.





More information about the rspec-users mailing list