Как проверить вложенные атрибуты в рельсах? - PullRequest
7 голосов
/ 12 марта 2011

У меня есть контроллер рельсов, определенный здесь:

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

На странице cart пользователь может указать количество line_items, разместив вложенные атрибуты. Параметры выглядят так:

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

В моем действии контроллера эти параметры сохраняются так:

@cart.update_attributes(params[:cart])

Но я не знаю, как проверить это поведение в тесте. @cart.attributes генерирует только атрибуты модели, а не вложенные атрибуты.

Как я могу проверить это поведение? Как смоделировать почтовый запрос с вложенными атрибутами в моих функциональных тестах?

Ответы [ 4 ]

6 голосов
/ 10 апреля 2012

Немного опоздал на вечеринку, но вы не должны проверять это поведение с контроллера.Вложенные атрибуты - это поведение модели.Контроллер просто передает что-либо в модель.В вашем примере с контроллером нет упоминаний о вложенных атрибутах.Вы хотите проверить наличие поведения, созданного accepts_nested_attributes_for в вашей модели

. Вы можете проверить это с помощью rSpec следующим образом:

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
3 голосов
/ 12 августа 2011

Предполагая, что вы используете Test :: Unit, и у вас есть корзина в @cart в настройке, попробуйте что-то подобное в тесте обновлений:

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
1 голос
/ 22 апреля 2011

Используя test/unit в Rails3, сначала сгенерируйте интеграционный тест:

rails g integration_test cart_flows_test

в созданном вами файле, который вы тестируете, что-то вроде:

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

Надеюсь, это помогло.

0 голосов
/ 13 марта 2011

После того, как вы обновите корзину с вложенными атрибутами, вы можете получить доступ к вложенным атрибутам, выполнив

@cart.line_items
...