未定义的方法 `formats=' 用于 ... Controller:Class
undefined method `formats=' for ... Controller:Class
我正在尝试使用 rspec 发送 'delete' 请求。问题是我收到以下错误:
undefined method `formats=' for Admin::CountriesController:Class
这是我的代码:
describe 'Admin user deletion button' do
def sign_in(user)
user.confirm!
visit '/login'
fill_in 'user_email', with: user.email
fill_in 'user_password', with: user.password
click_button 'login_submit'
end
it 'should display an error' do
@controller = Admin::UsersController
@admin = FactoryGirl.create(:admin)
sign_in @admin
delete :delete, user_id: -1
end
end
编辑:这是完整的错误:
1) Admin user deletion button with existing user should display an
error
Failure/Error: delete :delete, user_id: -1
NoMethodError:
undefined method 'formats=' for Admin::UsersController:Class
# ./spec/controllers/admin_user_deletion_spec.rb:51:in `block (3 levels) in '
编辑 2:这是控制器代码:
module Admin
# Controller for users admin panel
class UsersController < AdminController
include UserHelper
before_action :actual_user
def users
@users = User.normals.page(params[:users_page])
@admins = User.admins.page(params[:admins_page])
end
def new
@user = User.new
render :new_user
end
def create
user = User.new(user_params)
if user.save
flash[:notice] = "L'utilisateur #{user.name} a bien été creé"
else
flash[:alert] = "L'utilisateur n'a pas pu être créé"
end
redirect_to action: :users
end
def edit
render :edit_user
end
def update
if @user.update(user_params) && @user.confirm!
flash[:notice] = "L'utilisateur #{@user.name} a bien été mis à jour"
else
flash[:alert] = "L'utilisateur #{@user.name} n'a pas pu être mis à jour"
end
redirect_to action: :users
end
def delete
name = @user.name
if @user.destroy
flash[:notice] = "L'utilisateur #{name} a bien été supprimé"
else
flash[:alert] = "L'utilisateur #{name} n'a pas pu être supprimé"
end
redirect_to action: :users
end
private
def user_params
params[:user].delete(:password) if params[:user][:password].blank?
params.require(:user).permit!
end
def actual_user
@user = User.find(params[:user_id]) if params[:user_id]
end
end
end
- 千万不要涉足亚洲的一片土地war。
- 生死攸关时,切勿与西西里人作对。
- 切勿混淆控制器规格和功能规格。
控制器规格对其先决条件做出假设——功能规格没有。你混淆了两者,这是一个常见的错误。
你不应该在控制器规范中使用 visit
。相反,在对操作本身的调用中传递请求参数和(如有必要)会话数据。
至于请求失败的原因,请考虑错误消息:
NoMethodError: undefined method 'formats=' for Admin::UsersController:Class
这是因为你重新定义了controller实例变量并赋给它控制器class,而不是控制器instance ].相反,单独保留控制器实例变量并允许 RSpec 调用实例上的操作。
如果您需要进一步说服,请在规范的上下文中检查 @controller.respond_to?(:formats=)
的 return 值;在你的版本中 returns false
,但在标准控制器规范(例如由 RSpec 生成器创建的规范)中,这将 return true
.
我正在尝试使用 rspec 发送 'delete' 请求。问题是我收到以下错误:
undefined method `formats=' for Admin::CountriesController:Class
这是我的代码:
describe 'Admin user deletion button' do
def sign_in(user)
user.confirm!
visit '/login'
fill_in 'user_email', with: user.email
fill_in 'user_password', with: user.password
click_button 'login_submit'
end
it 'should display an error' do
@controller = Admin::UsersController
@admin = FactoryGirl.create(:admin)
sign_in @admin
delete :delete, user_id: -1
end
end
编辑:这是完整的错误:
1) Admin user deletion button with existing user should display an error Failure/Error: delete :delete, user_id: -1 NoMethodError: undefined method 'formats=' for Admin::UsersController:Class # ./spec/controllers/admin_user_deletion_spec.rb:51:in `block (3 levels) in '
编辑 2:这是控制器代码:
module Admin
# Controller for users admin panel
class UsersController < AdminController
include UserHelper
before_action :actual_user
def users
@users = User.normals.page(params[:users_page])
@admins = User.admins.page(params[:admins_page])
end
def new
@user = User.new
render :new_user
end
def create
user = User.new(user_params)
if user.save
flash[:notice] = "L'utilisateur #{user.name} a bien été creé"
else
flash[:alert] = "L'utilisateur n'a pas pu être créé"
end
redirect_to action: :users
end
def edit
render :edit_user
end
def update
if @user.update(user_params) && @user.confirm!
flash[:notice] = "L'utilisateur #{@user.name} a bien été mis à jour"
else
flash[:alert] = "L'utilisateur #{@user.name} n'a pas pu être mis à jour"
end
redirect_to action: :users
end
def delete
name = @user.name
if @user.destroy
flash[:notice] = "L'utilisateur #{name} a bien été supprimé"
else
flash[:alert] = "L'utilisateur #{name} n'a pas pu être supprimé"
end
redirect_to action: :users
end
private
def user_params
params[:user].delete(:password) if params[:user][:password].blank?
params.require(:user).permit!
end
def actual_user
@user = User.find(params[:user_id]) if params[:user_id]
end
end
end
- 千万不要涉足亚洲的一片土地war。
- 生死攸关时,切勿与西西里人作对。
- 切勿混淆控制器规格和功能规格。
控制器规格对其先决条件做出假设——功能规格没有。你混淆了两者,这是一个常见的错误。
你不应该在控制器规范中使用 visit
。相反,在对操作本身的调用中传递请求参数和(如有必要)会话数据。
至于请求失败的原因,请考虑错误消息:
NoMethodError: undefined method 'formats=' for Admin::UsersController:Class
这是因为你重新定义了controller实例变量并赋给它控制器class,而不是控制器instance ].相反,单独保留控制器实例变量并允许 RSpec 调用实例上的操作。
如果您需要进一步说服,请在规范的上下文中检查 @controller.respond_to?(:formats=)
的 return 值;在你的版本中 returns false
,但在标准控制器规范(例如由 RSpec 生成器创建的规范)中,这将 return true
.