使用Rails 3.2使用Agile Web教程测试新操作时的批量分配安全性错误

Cas*_*lle 2 ruby-on-rails-3

我正在通过Agile Web教程进行一些细微的更改.当我在Rails 3.2中运行功能测试时,我收到以下错误:

test_should_get_new(OrdersControllerTest):
ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: cart, deal
Run Code Online (Sandbox Code Playgroud)

这是orders_controller_test.rb代码:

test "should get new" do
  cart = Cart.create
  session[:cart_id] = cart.id
  LineItem.create(cart: cart, deal: deals(:one))

  get :new
  assert_response :success
end
Run Code Online (Sandbox Code Playgroud)

这是订单夹具:

one:
  name: MyString
  address: MyText
  email: MyString
  pay_type: Check
Run Code Online (Sandbox Code Playgroud)

这是行项目装置:

one:
  deal: one
  order: one
Run Code Online (Sandbox Code Playgroud)

这是交易夹具:

one:
  title: MyString
  description: MyText
  image_url: MyString
  price: 9.99
Run Code Online (Sandbox Code Playgroud)

这是订单控制器代码:

def new
  @cart = current_cart
  if @cart.line_items.empty?
    redirect_to store_url, notice: "Your cart is empty"
    return
  end

  @order = Order.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @order }
  end
end
Run Code Online (Sandbox Code Playgroud)

我尝试使用FactoryGirl但仍然收到相同的错误消息.这是代码:

test "should get new" do
  cart = FactoryGirl.build(:cart)
  session[:cart_id] = cart.id
  LineItem.create(cart: cart, deal: deals(:one))

  get :new
  assert_response :success
end
Run Code Online (Sandbox Code Playgroud)

和FactoryGirl代码:

FactoryGirl.define do  
  factory :cart do
  end
end
Run Code Online (Sandbox Code Playgroud)

对于FactoryGirl我也试过'create'而不是'build'并得到了相同的错误信息.

虽然我可以在配置中关闭质量分配错误,但我宁愿不要因为我更喜欢正确测试.

有什么建议吗?

Col*_*n R 5

而不是LineItem.create(cart: cart, deal: deals(:one))尝试

item = LineItem.create
item.cart = cart
item.deal = deals(:one)
Run Code Online (Sandbox Code Playgroud)

或者在LineItem模型中,添加:

attr_accessible :cart, :deal
Run Code Online (Sandbox Code Playgroud)