Marcelo de Moraes Serpa 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:
http://en.wikipedia.org/wiki/Method_stub
http://en.wikipedia.org/wiki/Mock_object
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.
Hmm.. I can see your point as far as where the methods live being
confusing. Reading about stub method in the RDoc pages for mock methods
does seem odd. The reason, as David, pointed out is really more due to
reducing code duplication between the two. Any suggestions on making it
better?
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?).
I think you raise a good question whether or not stub_model is a best
name for the functionality it provides. I think stub_model is really
called a partial stub.. or partial mock. Hmm.. I'm not quite sure what
the correct name is. But basically, as you said, it is the real object
but is not allowed to touch the DB. So it is there for performance
reasons mostly. mock_model however gives you a dummy object with some
predefined stubbed methods that you typically want for an AR object
(i.e. #id). However, it is very true that in many cases you will be
using this "mock_model" as a stub. I can see how having stub_model can
cause confusion...
Perhaps, a better API would be to alias stub_model to mock_model (this
would be more aligned with the #mock and #stub API) and then have a
partial_stub_model or stub_model(Model, :partial => true)? Changing it
now I'm sure would make some people upset but it could be done with
deprecation warnings if it is causing that much confusion... This would
really be David's call to make and I'm guessing he had some good reasons
for making the decision he did in the first place.
And there's the Spec::Mocks::Methods#stub method, which is the one
that reflects the concept that "the Stub is a dummy method".
Again, this is due to the implementation.. I see your point, but I
don't know if the typical user really cares where it lives. Perhaps a
little explanation in the RDoc would be sufficient to avoid confusion?
-Ben
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users