Rodrigo Rosenfeld Rosas
2011-Apr-21 01:34 UTC
[rspec-users] stubbing find in ActiveRecord considering only the first argument
For some unknown (yet) reason, an association is trying to call Model.find(1, conditions: nil) instead of Model.find(1), which doesn''t allow me to write "Model.stub!(:find).with(1).and_returns(@model)". Instead of trying to figure out (I will anyway) why it is been calling this way, what I really wanted was to be able to stub ''find'' whether it is called find(id) or find(id, options) in a single line, since I don''t want to give extra focus on this because this is not the subject of my tests. They should be read cleanly. Is it possible? I know I can do this: Model.stub!(:find){|a, *args| a==1 ? s : nil } But it is too ugly... :) Also, can someone point me some more in-depth documentation about mocks and stubs in Rspec? The Rdoc and the official documentation seem to be far from complete... For instance, from the documentation I''m unable to find any references to mock(MyModel), for instance. So I''m not sure what exactly this does... For instance, if I create 2 instances, will each of the mocks have different ID''s? I can get some hints by experimentation, but this is not documented anywhere... For instance, calling "mock(Model).id" will raise a not existent method error. So I tested "mock(Model, id: 1)" and it worked. https://github.com/rspec/rspec https://github.com/rspec/rspec-mocks http://rubydoc.info/gems/rspec-mocks/2.4.0/frames Then I have the following dilemma. Using Machinist with Blueprint, Sham and Faker made fixture generation a trivial task while making my tests pretty clean. On the other side, they are a bit slow... I don''t know if Machinist can be integrated to some mock framework or if I can get about the same result using mocks instead of real instances. I took a glance over FactoryGirl and it seems to have some kind of support but couldn''t find any in-depth documentation for it either... Suppose we have in Rails: class ModelA belongs_to :model_b end I would like to have some kind of factory with some syntax like: a=factory.create(ModelA) # or ModelA.make, like Machinist does... a.id == 1 a.model_b.id == 1 b=factory.create(ModelA) b.id == 2 b.model_b.id == 2 c=factory.create(ModelA, model_b: b.model_b) c.id == 3 c.model_b.id == 2 I really don''t care if it will be 1, 2, etc as long as they are unique... a, b, c should all be mocked versions of the class. Is there already any implementation of this idea? Was I clear enough? Sometimes I have a feeling I''m not being clear enough and this is one of these times :) Best regards, Rodrigo.
Rodrigo Rosenfeld Rosas
2011-Apr-21 01:43 UTC
[rspec-users] stubbing find in ActiveRecord considering only the first argument
I''ve just found mock_model: http://rubydoc.info/gems/rspec-rails/2.4.0/frames Seems like it solves my problem ;) Em 20-04-2011 22:34, Rodrigo Rosenfeld Rosas escreveu:> For some unknown (yet) reason, an association is trying to call > Model.find(1, conditions: nil) instead of Model.find(1), which doesn''t > allow me to write "Model.stub!(:find).with(1).and_returns(@model)". > > Instead of trying to figure out (I will anyway) why it is been calling > this way, what I really wanted was to be able to stub ''find'' whether > it is called find(id) or find(id, options) in a single line, since I > don''t want to give extra focus on this because this is not the subject > of my tests. They should be read cleanly. > > Is it possible? I know I can do this: > > Model.stub!(:find){|a, *args| a==1 ? s : nil } > > But it is too ugly... :) > > > Also, can someone point me some more in-depth documentation about > mocks and stubs in Rspec? The Rdoc and the official documentation seem > to be far from complete... For instance, from the documentation I''m > unable to find any references to mock(MyModel), for instance. So I''m > not sure what exactly this does... For instance, if I create 2 > instances, will each of the mocks have different ID''s? I can get some > hints by experimentation, but this is not documented anywhere... For > instance, calling "mock(Model).id" will raise a not existent method > error. So I tested "mock(Model, id: 1)" and it worked. > > https://github.com/rspec/rspec > https://github.com/rspec/rspec-mocks > http://rubydoc.info/gems/rspec-mocks/2.4.0/frames > > > Then I have the following dilemma. Using Machinist with Blueprint, > Sham and Faker made fixture generation a trivial task while making my > tests pretty clean. On the other side, they are a bit slow... I don''t > know if Machinist can be integrated to some mock framework or if I can > get about the same result using mocks instead of real instances. I > took a glance over FactoryGirl and it seems to have some kind of > support but couldn''t find any in-depth documentation for it either... > > Suppose we have in Rails: > > class ModelA > belongs_to :model_b > end > > I would like to have some kind of factory with some syntax like: > > a=factory.create(ModelA) # or ModelA.make, like Machinist does... > a.id == 1 > a.model_b.id == 1 > > b=factory.create(ModelA) > b.id == 2 > b.model_b.id == 2 > > c=factory.create(ModelA, model_b: b.model_b) > c.id == 3 > c.model_b.id == 2 > > I really don''t care if it will be 1, 2, etc as long as they are > unique... a, b, c should all be mocked versions of the class. Is there > already any implementation of this idea? > > Was I clear enough? Sometimes I have a feeling I''m not being clear > enough and this is one of these times :) > > Best regards, Rodrigo.