如何在rails中测试嵌套属性?

时间:2011-03-12 17:41:30

标签: ruby-on-rails testing functional-testing

我有一个rails控制器,在这里定义:

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仅生成模型属性而非嵌套属性。

如何测试此行为?如何在我的功能测试中使用嵌套属性模拟post请求?

4 个答案:

答案 0 :(得分:6)

派对有点迟,但你不应该从控制器测试这种行为。嵌套属性是模型行为。控制器只是将任何东西传递给模型。在您的控制器示例中,没有提及任何嵌套属性。您希望测试模型中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

答案 1 :(得分:3)

假设您正在使用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

答案 2 :(得分:1)

在Rails3中使用test/unit,首先生成集成测试:

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

我希望有所帮助。

答案 3 :(得分:0)

使用嵌套属性更新购物车后,您可以通过执行

来访问嵌套属性
@cart.line_items