簡體   English   中英

我的rspec測試中的批量分配錯誤(Rails.32,active_admin,rspec)

[英]Error of mass assignement on my rspec test (Rails.32, active_admin, rspec)

我正在構建一個日常交易應用程序來學習RoR。

我的問題是關於attr_accessible以及如何在保護屬性免遭大量分配的情況下測試模型。

我的應用程序中有3個模型:

  • 用戶(通過設計)
  • 交易
  • Admin_users(通過活動的admin gem)

基本上,Deals屬於Admin_users,我只希望管理員用戶能夠發布Deal。

我的問題是,如果我沒有記錯,我需要將所有屬性attr_accessible放在attr_accessible以便我可以創建表單並保存交易,然后為了保護屬性(尤其是admin_user_id),我添加了with_role as: :admin以保護它們並且僅允許管理員訪問(我以此為靈感: http : //ejholmes.github.io/2012/04/22/handling-mass-assignment-with-active-admin.html

我的問題是放置as: :admin之前運行的RSpec測試現在失敗了,我得到的錯誤消息是:

   ActiveModel::MassAssignmentSecurity::Error:
   Can't mass-assign protected attributes: url_path, country, title, description, twitter_msg, image_url, prelaunch_date, deal_launch_date, deal_end_date, featured, admin_user_id

我認為RSpec無法讓我成為管理員,所以我有權批量分配這些屬性。

我該如何解決?

這是我的文件供參考:

deal_spec.rb

class Deal < ActiveRecord::Base

belongs_to :admin_user, :foreign_key => 'admin_user_id'

attr_accessible :url_path,
              :country,
              :title,
              :description,
              :twitter_msg,
              :image_url,
              :prelaunch_date,
              :deal_launch_date,
              :deal_end_date,
              :featured,
              :admin_user_id,
              :as => :admin_user

validates :title,
          presence: true,
          length: { maximum: 200 }

我的活動管理員設置:在initializers / active_admin.rb上

ActiveAdmin.setup do |config|

config.site_title = "My App"


config.logout_link_path = :destroy_admin_user_session_path


config.batch_actions = true

# got it on http://ejholmes.github.io/2012/04/22/handling-mass-assignment-with-active-admin.html
module ActiveAdmin
 class BaseController
   with_role :admin_user
 end
end

end
  • 我的測試文件:

admin_users的工廠:

FactoryGirl.define do
  factory :admin_user do
  sequence(:email) { |n| "person_#{n}@example.com"}   
  password "admin_pass"
  password_confirmation "admin_pass"
end
end

測試實際上是失敗的:這是標題長度測試的一個示例:

require 'spec_helper'
require 'date'

describe Deal do

let(:admin_user) { FactoryGirl.create(:admin_user) }

before(:each) do
@attr = {
  url_path:    "lorem ipsum",
  country:     "France",
  title:       "lorem ipsum",
  description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
  twitter_msg: "http://www.example.com",
  image_url:   "http://www.example2.com",
  prelaunch_date:     2.days.from_now.change(hour: 10),
  deal_launch_date:   3.days.from_now.change(hour: 10),
  deal_end_date:      15.days.from_now.change(hour: 10),
  featured:           true,
  admin_user_id: 1
}

describe "tests TITLES" do
it { should validate_presence_of(:title) }

it "should reject title that is too long" do
  long = "a" * 211
  hash = @attr.merge(:title => long)
  Deal.new(hash).should have(1).error_on(:title)
end


end

我覺得還沒有告訴我的deal_rspec.rb測試文件:: admin_user確實是管理員! 我不知道該怎么做,即使我很好地保護了我的Deal模型屬性免於大規模分配。 有人知道我怎樣才能使這些測試再次通過嗎?

這里的問題是:as =>:admin標志沒有引用active_record模型,它只是您定義的任意符號。 使用它意味着您需要像這樣在create調用中以:admin傳遞

Deal.create(params[:deal], as: :admin)

因此,您的實際問題可能出在工廠,因為在制造對象時它不知道傳遞標志。 試試這個

factory :deal do
  my_attr "abc"
  initialize_with do
    create(attributes, as: :admin)
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM