[rspec-users] spec-ing a nested object is saved on the specs of the object it is nested into

David Chelimsky dchelimsky at gmail.com
Mon Mar 15 09:15:55 EDT 2010

On Fri, Mar 12, 2010 at 7:45 AM, Joaquin Rivera Padron
<joahking at gmail.com> wrote:
> hi there,
> I have a Rails model A, that has_one model B, model A have a method called
> save_nested_b that:
> * context 'invalid B params'
>  ** context 'no nested B exists' => do nothing
>  ** context 'nested B exists' => remove it
> * context 'valid B params'
>  ** context 'no nested B exists' => create it
>  ** context 'nested B exists' => remove it and create new one (or edit
> attributes linking to A)
> the save_nested_b method implementation should not be problematic. My
> question is:
> on A specs I want to make sure all above on the list happens but not having
> to repeat all B validations on making 'invalid B params' examples, because B
> have its own specs, and also the A specs for save_nested_b will be brittle
> when B validations change (not to mention the combinations of invalid fields
> can be long)
> how would you do this? would you do a loose thing like:
> context 'invalid B params' do
> ..
> a.save_nested_b nil
> a.should have_no_b
> ..
> end
> giving it a more thought after writing this email I guess I would go for this approach, what do you think?

Depends on who is calling save_nested_b. I usually save associations
via callbacks as part of the save operation, and wouldn't call
save_nested_b from outside the A object. In that case, I'd treat
save_nested_b as a private method and likely not spec it directly.

a = A.create!(valid_a_attributes, :b => valid_b_attributes)
a.should have_a_b

a = A.create!(valid_a_attributes, :b => invalid_b_attributes)
a.should have_no_b




More information about the rspec-users mailing list