Forum: Ruby on Rails Problems using nested objects in a test

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Heinz S. (Guest)
on 2009-03-01 17:31
Hey,

I'm having some problems testing the creation of objects with nested
objects. First of all, the test itself:
def test_should_create_user
  assert_difference('User.count') do
    post :create, :user => {
  :character => characters(:user_controller_test),
  :username => 'test123',
  :password => 'test123', :password_confirmation => 'test123',
  :email => 'removed_email_address@domain.invalid' }
  end
  assert_redirected_to
end

My problem is, that :character has an object as value and converting it
to an arraay with .to_a doesn't really help cause the create method in
the Users controller looks like:
@nationality = Nationality.find(params[:character][:nationality])
params[:character][:nationality] = @nationality
params[:character][:birthday] =
Date.strptime(params[:character][:birthday], '%d.%m.%Y').to_s(:db)
@user = User.new(params[:user])
@character = Character.new(params[:character])
@user.character = @character

When I convert the characters(:user_controller_test) to an array it has
:nationality_id as a value but not :nationality as I'd have it when I
was using a normal form.

Does anyone know how I could solve that problem?

One more thing.. I've got many nested objects in User that's why I need
to create @nationality and @character in order to create @user and
actually save it. Is there a more convenient way of doing this than I do
it above?

Thanks
Frederick C. (Guest)
on 2009-03-01 18:56
(Received via mailing list)
On Mar 1, 3:31 pm, Heinz S. <removed_email_address@domain.invalid>
wrote:
>   :email => 'removed_email_address@domain.invalid' }
> Date.strptime(params[:character][:birthday], '%d.%m.%Y').to_s(:db)
> @user = User.new(params[:user])
> @character = Character.new(params[:character])
> @user.character = @character
>
> When I convert the characters(:user_controller_test) to an array it has
> :nationality_id as a value but not :nationality as I'd have it when I
> was using a normal form.
>
> Does anyone know how I could solve that problem?

It's up to you to create the sort of hash that would have been
submitted normally. If the way your controller and test data work
means that you have to spell that our at :character => {:nationality
=> characters(:user_controller_test).something.something ...} then
you've just got to get on with it

Fred
Heinz S. (Guest)
on 2009-03-01 19:01
So there's no method to create the hash the way it'd be accepted? Sounds
like a helper method... :)
Frederick C. (Guest)
on 2009-03-01 19:04
(Received via mailing list)
On Mar 1, 5:01 pm, Heinz S. <removed_email_address@domain.invalid>
wrote:
> So there's no method to create the hash the way it'd be accepted? Sounds
> like a helper method... :)

Well given an activerecord object then foo.attributes is a hash of
attributes, however this cannot anticipate how you're handling things
in the controller (eg nationality/nationality_id and the thing you're
doing with dates)

Fred
This topic is locked and can not be replied to.