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

abo*_*nec 7 testing ruby-on-rails functional-testing

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

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

购物车页面上,用户可以通过发布嵌套属性来指定line_items的数量.参数如下所示:

{ "cart" => {
  "line_items_attributes" => {
    "0" => {
      "quantity" => "2",
      "id" => "36" } } },
  "commit" => "Update Cart",
  "authenticity_token" => "UdtQ+lchSKaHHkN2E1bEX00KcdGIekGjzGKgKfH05So=",
  "utf8"=>"\342\234\223" }
Run Code Online (Sandbox Code Playgroud)

在我的控制器动作中,这些参数保存如下:

@cart.update_attributes(params[:cart])
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在测试中测试这种行为.@cart.attributes仅生成模型属性而不是嵌套属性.

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

stu*_*rtc 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
Run Code Online (Sandbox Code Playgroud)


Mik*_*wis 0

使用嵌套属性更新购物车后,您可以通过执行以下操作来访问嵌套属性

@cart.line_items
Run Code Online (Sandbox Code Playgroud)