Problems using nested objects in a test


#1

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


#2

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


#3

So there’s no method to create the hash the way it’d be accepted? Sounds
like a helper method… :slight_smile:


#4

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… :slight_smile:

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