[rspec-users] On Mocks vs Stubs in the context of rSpec
Marcelo de Moraes Serpa
celoserpa at gmail.com
Fri Jul 24 12:53:42 EDT 2009
>In the context of rSpec/rSpec-Rails, however, the API makes it
>confusing, to be honest. Being able to create a Mock with
>Spec::Mocks:Mock with Spec::Mocks::ExampleMethods# confuses me.
Ops! In this paragraph I forgot to put the instance method name: It
should read Spec::Mocks::ExampleMethods#stub
On Fri, Jul 24, 2009 at 11:51 AM, Marcelo de Moraes
Serpa<celoserpa at gmail.com> wrote:
> Thanks David and Ben for the comprehensive replies! I really appreciate it :)
> These wikipedia articles helped me to understand on the more conceptual level:
> So, if I understand it right -- Stub is for methods and Mocks are for
> roles (or, in the technical-level -- objects).
> In the context of rSpec/rSpec-Rails, however, the API makes it
> confusing, to be honest. Being able to create a Mock with
> Spec::Mocks:Mock with Spec::Mocks::ExampleMethods# confuses me.
> The same applies for stub_model() and mock_model(). I know that
> mock_model is a convenience method that can be used to create an
> object with an API similar to ActiveRecord::Base's. The API says
> stub_model is basically the same, but prevents the object from
> accessing the database. Ok, but why attaching these concepts to Stub?
> Is this the right name to use for this method? (Stub == mock object
> that is not allowed to access the database?).
> And there's the Spec::Mocks::Methods#stub method, which is the one
> that reflects the concept that "the Stub is a dummy method".
> So, in sum, my perception is that rSpec/rSpec-Rails implement all the
> functionality needed to implement Mocks and Stubs, but in a confusing
> way. IMHO, the API is not succinct in this aspect -- it does not
> communicate a clear distinction between Mocks and Stubs and this makes
> it hard for someone new to TDD/BDD to use them in the right way or
> decide the best way to use them.
> My 0.4 cents of Brazilian Reals.
> @David -- yes, I'm Brazilian! You've got a good gut! And I'm glad to
> see that you know Portuguese! :)
> On Thu, Jul 23, 2009 at 8:47 PM, David Chelimsky<dchelimsky at gmail.com> wrote:
>> On Jul 23, 7:41 pm, Ben Mabey <b... at benmabey.com> wrote:
>>> Marcelo de Moraes Serpa wrote:> Hello list,
>>> > >From what I could see, the lines between mocks and stubs are subtle,
>>> > but the general idea I got is that mocks set expectations and stubs
>>> > are only dummy objects/method calls. What confused me though, is that
>>> > the stub() method is an alias for mock() in
>>> > Spec::Mocks::ExampleMethods. So a stub is a mock?
>>> Yes, no, and maybe so. :p I agree with your general understanding that
>>> "mocks set expectations and stubs are only dummy objects/method calls".
>>> The fact that rspec using the same machinery to provide stubs and mocks
>>> is really inconsequential because the deciding factor of what they are
>>> is how you use them. You can, IMO, use a "mock" like a stub and a
>>> "stub" like a mock.. Take this for example:
>>> describe "#some_method" do
>>> it "delegates to some_obejct" do
>>> some_object = stub('some object', :some_method => "foo")
>>> my_object = MyObject.new(some_object)
>>> my_object.some_method.should == "foo"
>>> We are using a stub as a dummy object, and yet our expectation is
>>> clearing testing the method call. So is the above a stub or is it
>>> really a mock? I would say that it is acting like a mock. I hope that
>>> others on the list will correct me if I am wrong making this
>>> observation/conclusion. Likewise we could use a mock as a dummy object
>>> and never set any expectations on it and it would be acting like a
>>> stub. Even though stub and mock is the same in RSpec you should still
>>> use the correct name when using them.
>>> > Also, another thing that is confusing: You have stub and stub! methods
>>> > in the Spec::Mocks::Methods namespace, what is the difference between
>>> > Spec::Mocks::ExampleMethods#stub and Spec::Mocks::Methods#stub ?
>>> Spec::Mocks::ExampleMethods are the methods that you can call during the course of a code example. So when you say stub("something") the method in Spec::Mocks::ExampleMethods gets called and returns you a stub. Now, that stub object now has it's own #stub method which lives on Spec::Mocks::Methods#stub. That call will stub out the provided method and return value... So my_stub.stub(:foo, "bar"), however that is aliased from #stub! which is used most often. This is all from memory so I could be wrong but that is the general gist of it.
>> Ben and I are secretly the same person.
>> rspec-users mailing list
>> rspec-users at rubyforge.org
More information about the rspec-users