8 Stimmen

Wie testet man verschachtelte Attribute in Rails?

Ich habe einen Schienen-Controller, der hier definiert ist:

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

Auf der Wagen Seite kann ein Benutzer die Anzahl der Einzelposten angeben, indem er verschachtelte Attribute bucht. Die Parameter sehen wie folgt aus:

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

In meiner Controller-Aktion werden diese Parameter wie folgt gespeichert:

@cart.update_attributes(params[:cart])

Aber ich weiß nicht, wie ich dieses Verhalten in einem Test überprüfen kann. @cart.attributes erzeugt nur Modellattribute, nicht aber verschachtelte Attribute.

Wie kann ich dieses Verhalten testen? Wie simuliere ich eine Postanforderung mit verschachtelten Attributen in meinen Funktionstests?

8voto

stuartc Punkte 2234

Ich bin zwar etwas spät dran, aber Sie sollten dieses Verhalten nicht über den Controller testen. Verschachtelte Attribute sind Modellverhalten. Der Controller übergibt einfach alles an das Model. In Ihrem Controller-Beispiel werden keine verschachtelten Attribute erwähnt. Sie wollen auf die Existenz des Verhaltens testen, das durch accepts_nested_attributes_for in Ihrem Modell

Sie können dies mit rSpec wie folgt testen:

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

3voto

Francis Potter Punkte 1599

Angenommen, Sie verwenden Test::Unit und haben einen Einkaufswagen in @cart in der Einrichtung, versuchen Sie etwas wie dieses in Ihrem Update-Test:

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

2voto

Marco Antonio Punkte 1339

Verwendung von test/unit in Rails3, erstellen Sie zunächst einen Integrationstest:

rails g integration_test cart_flows_test

in der generierten Datei fügen Sie den Test ein, etwa so:

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

Ich hoffe, das hat geholfen.

0voto

Mike Lewis Punkte 62061

Nachdem Sie den Warenkorb mit den verschachtelten Attributen aktualisiert haben, können Sie auf die verschachtelten Attribute zugreifen, indem Sie

@cart.line_items

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X