我有一个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请求?
答案 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