Forum: RSpec Having A Problem Understanding mocks with .build

Posted by Ants Pants (Guest)
on 2011-12-04 14:51
(Received via mailing list)
Hello everyone,

I am trying to do the following ....

before(:each) do
    @valid_attributes = {:foo => 'bar'}

    @event_type = event_category.event_types.build(@valid_attributes)
    $stderr.puts "**** #{@event_type.class} *****"
end

let (:event_category) { mock_model(EventCategory).as_null_object }

and the problem I'm having is that @event_type is coming back as
EventCategory and not EventType.

Because of this problem, I thought, eh, I didn't know Rails did that! 
So I
checked use of .build in the real code and it does return EventType.

I'm obviously doing something stupidly wrong in the test but I just 
can't
figure it out.

Any pointers would be greatly appreciated, thank you.

-ants
Posted by David Chelimsky (Guest)
on 2011-12-04 15:01
(Received via mailing list)
On Dec 4, 2011, at 7:48 AM, Ants Pants wrote:

> let (:event_category) { mock_model(EventCategory).as_null_object }
>
> and the problem I'm having is that @event_type is coming back as EventCategory 
and not EventType.
>
> Because of this problem, I thought, eh, I didn't know Rails did that!  So I 
checked use of .build in the real code and it does return EventType.
>
> I'm obviously doing something stupidly wrong in the test but I just can't figure 
it out.
>
> Any pointers would be greatly appreciated, thank you.

event_category is a mock_model, not an EventCategory. Since it's 
declared as_null_object, when it receives :event_types, it returns 
itself, and then does the same for :build. So it's not really even an 
EventCategory: it's a the same mock_model object, which is designed to 
lie about it's class in order to be able to work with form builders.

HTH,
David
Posted by Ants Pants (Guest)
on 2011-12-04 16:13
(Received via mailing list)
David,

Thanks very much for the reply. I was aware I was dealing with a mock, 
but
I thought in this instance it would fool event_types into thinking it 
was a
genuine object to allow the association to be made and return EventType.

So what are my options? To add the data to the DB or to build the object
the long way round

@et = EventType.new(@avalid_attributes)
@et.event_category = event_category ## mock
@et.save!


While I have your ears, is it necessary to replicate the behaviour in 
the
model spec of how a controller builds an object? i.e use .build in the
controller and use .new in the spec. I mean, to me, it doesn't matter as
all I'm really concerned with is working with the object no matter how 
it's
built.

Great piece of software and book, by-the-way. Thanks very much for it.

-ants
Posted by David Chelimsky (Guest)
on 2011-12-04 22:55
(Received via mailing list)
On Dec 4, 2011, at 8:37 AM, Ants Pants wrote:

>>     @event_type = event_category.event_types.build(@valid_attributes)
>>
>> Any pointers would be greatly appreciated, thank you.
>
> event_category is a mock_model, not an EventCategory. Since it's declared 
as_null_object, when it receives :event_types, it returns itself, and then does 
the same for :build. So it's not really even an EventCategory: it's a the same 
mock_model object, which is designed to lie about it's class in order to be able 
to work with form builders.

> David,
>
> Thanks very much for the reply. I was aware I was dealing with a mock, but I 
thought in this instance it would fool event_types into thinking it was a genuine 
object to allow the association to be made and return EventType.
>
> So what are my options? To add the data to the DB or to build the object the 
long way round
> @et = EventType.new(@avalid_attributes)
> @et.event_category = event_category ## mock
> @et.save!

Depends on where this is. I try to use the db in model specs, but avoid 
it in controller specs.

> While I have your ears, is it necessary to replicate the behaviour in the model 
spec of how a controller builds an object? i.e use .build in the controller and 
use .new in the spec. I mean, to me, it doesn't matter as all I'm really concerned 
with is working with the object no matter how it's built.

Generally speaking, I agree, but every situation is a little different.

> Great piece of software and book, by-the-way. Thanks very much for it.

Thanks!
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.