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

Reply via email to