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
on 2011-12-04 14:51
on 2011-12-04 15:01
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
on 2011-12-04 16:13
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
on 2011-12-04 22:55
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
Log in with Google account | Log in with Yahoo account
No account? Register here.