gpt4 book ai didi

ruby - Rspec - 后 - MassAssignmentSecurity::Error

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:10 24 4
gpt4 key购买 nike

我有几个模型:UserArticle。用户有_多篇文章,文章属于用户。

我尝试编写测试来检查 Post 方法(注意:我在我的应用程序中使用语言环境):

require 'spec_helper'

describe ArticlesController do
render_views

before(:each) do
@admin = FactoryGirl.create( :admin )
@user = FactoryGirl.create( :user )
end

describe "POST 'create'" do
before(:each){ @article = FactoryGirl.create(:article) }

describe "for signed-in admin" do
before(:each){ test_sign_in( @admin ) }

it "should create article" do
expect do
post :create, :locale => :en, :article => @article.attributes.merge( :content => "some" )
end.should change( Article, :count ).by(1)
end
end
end
end

但是我得到这样的错误:

1) ArticlesController POST 'create' for signed-in admin should create article
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: id, user_id, created_at, updated_at
Failure/Error: post :create, :locale => :en, :article => @article.attributes.merge( :content => "some" )
# ./app/controllers/articles_controller.rb:15:in `create'
# ./spec/controllers/articles_controller_spec.rb:106:in `block (5 levels) in <top (required)>'
# ./spec/controllers/articles_controller_spec.rb:105:in `block (4 levels) in <top (required)>'

我该如何解决?

我的工厂:

FactoryGirl.define do
factory :user do
sequence(:email) { |n| "email#{n}@factory.com" }
password 'qwerty'

factory :admin do
admin true
end
end

factory :article do
content 'text is here'
user
end
end

我的 Controller :

class ArticlesController < ApplicationController
before_filter do
redirect_to :root unless current_user && current_user.admin?
end

def create
@article = Article.new( params[:article] )

if @article.save
redirect_to articles_path
flash[:success] = "It has been created!"
else
render 'new'
end
end
end

文章模型:

# == Schema Information
#
# Table name: articles
#
# id :integer not null, primary key
# user_id :integer
# content :text
# created_at :datetime not null
# updated_at :datetime not null
#

class Article < ActiveRecord::Base
belongs_to :user

attr_accessible :content

validates :content,
:presence => { :message => :presense_message },
:length => {
:maximum => 50000,
:message => :max_lenght_message
}
end

UPD:申请在这里:https://github.com/Loremaster/Chirch_app

最佳答案

如果不直接测试你的代码我不能肯定地说,但尝试改变

before(:each){ @article = FactoryGirl.create(:article) } 

before(:each){ @article = FactoryGirl.build(:article, :user => @admin) } 

这样您就可以为文章提供作者以及 not saving the article在调用 POST 之前。此外,这一行也应该在您的 describe "for signed-in admin" block 中。

编辑

如果您更改测试代码,您的 MassAssignmentSecurity::Error 将消失,以便您构建您的 :article 预先 具有 your factories 中定义的所有必要参数:

spec/controllers/articles_controllers.spec

describe "POST 'create'" do
before(:each) do
@article = FactoryGirl.build(:article, :user => @admin, :content => "some")
end

describe "for non-signed users" do
it "should deny access" do
post :create, :locale => :en, :article => @article
response.should redirect_to( root_path )
end

it "should not create article" do
expect do
post :create, :locale => :en, :article => @article
end.should_not change( Article, :count )
end
end

describe "for signed-in users" do
before(:each){ test_sign_in( @user ) }

it "should deny access" do
post :create, :locale => :en, :article => @article
response.should redirect_to( root_path )
end

it "should not create article" do
expect do
post :create, :locale => :en, :article => @article
end.should_not change( Article, :count )
end
end

关于ruby - Rspec - 后 - MassAssignmentSecurity::Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com