2011-03-12 10 views
7

que tienen un controlador de rieles, que se define aquí:¿Cómo probar atributos anidados en rieles?

https://github.com/abonec/Simple-Store/blob/master/app/controllers/carts_controller.rb

En la página cart un usuario puede especificar la cantidad de line_items mediante la publicación de atributos anidados. Los parámetros tienen el siguiente aspecto:

{ "cart" => { 
    "line_items_attributes" => { 
    "0" => { 
     "quantity" => "2", 
     "id" => "36" } } }, 
    "commit" => "Update Cart", 
    "authenticity_token" => "UdtQ+lchSKaHHkN2E1bEX00KcdGIekGjzGKgKfH05So=", 
    "utf8"=>"\342\234\223" } 

En mi acción del controlador estos parametros se guardan como esto:

@cart.update_attributes(params[:cart]) 

Pero no sé cómo probar este comportamiento en una prueba. @cart.attributes solo genera atributos de modelo, no atributos anidados.

¿Cómo puedo comprobar este comportamiento? ¿Cómo simular una solicitud posterior con atributos anidados en mis pruebas funcionales?

Respuesta

0

Después de actualizar el carro con los atributos anidados, puede acceder a los atributos anidados haciendo

@cart.line_items 
+0

Cómo acceder a los atributos anidados que conozco, pero no sé cómo simular una solicitud posterior con atributos anidados en mis pruebas funcionales. – abonec

1

Usando test/unit en Rails3, generar primero una prueba de integración:

rails g integration_test cart_flows_test 

en el generada archivo que incluye prueba, algo como:

test "if it adds line_item through the cart" do 
    line_items_before = LineItem.all 
    # don't forget to sign in some user or you can be redirected to login page 
    post_via_redirect '/carts', :cart => {:line_items_attributes=>{'0'=>{'quantity'=>2, 'other_attr'=>"value"}}} 

    assert_template 'show' 
    assert_equal line_items_before+1, LineItem.all 
end 

Espero que haya ayudado.

3

Suponiendo que está usando Test :: Unidad, y usted tiene un carro en @cart en la configuración, probar algo como esto en su prueba de actualización:

cart_attributes = @cart.attributes 
line_items_attributes = @cart.line_items.map(&:attributes) 
cart_attributes[:line_items] = line_items_attributes 
put :update, :id => @cart.to_param, :cart => cart_attributes 
5

Un poco tarde a la fiesta, pero no deberías probar ese comportamiento desde el controlador. Los atributos anidados son comportamiento del modelo. El controlador solo pasa algo al modelo. En su ejemplo de controlador, no se menciona ningún atributo anidado. ¿Quieres probar la existencia de la conducta creado por accepts_nested_attributes_for en su modelo

Puede probar esto con RSpec así:

it "should accept nested attributes for units" do 
    expect { 
    Cart.update_attributes(:cart => {:line_items_attributes=>{'0'=>{'quantity'=>2, 'other_attr'=>"value"}}) 
    }.to change { LineItems.count }.by(1) 
end 
Cuestiones relacionadas