【问题标题】:How to test Mass Assignment in Rails 4 using RSpec如何使用 RSpec 在 Rails 4 中测试质量分配
【发布时间】:2013-02-28 13:07:27
【问题描述】:

给定一个简单的用户模型,在 Rails 4 中,带有姓名、电子邮件和管理员布尔值,使用 RSpec 测试批量分配的最佳方法是什么?

这是用户控制器:

def create
  @user = User.new user_params
  ...snip
end

private

  def user_params
    params.require(:user).permit(:name, :email)
  end

还有两种不同的测试方法:

在 user_spec.rb 中

describe "accessible attributes" do
  describe "should not allow access to admin" do
    before do 
      @user.admin = "1"
      @user.save
    end
    it { should_not be_admin }
  end
end

或在 users_controller_spec.rb 中

it 'should only allow name and email to be set' do
  @controller.user_params.keys.should eq(['name', 'email')
end

两者都不起作用 - 前者只是创建了一个 admin 设置为 true 的用户(未通过测试) - 大概这绕过了 strong_parameters。后者有效,但前提是 user_params 方法不是私有的。 (官方文档建议将其设置为私有。注意 - 在 user_spec 中查看 MassAssignment 错误也不起作用(不会引发错误)。

注意 - 实际上在视图中将用户设置为 admin 可以正常工作 - admin 属性已被过滤掉,一切正常,但真的很想在测试中看到它正常工作。

另一种建议是将 shoulda-matchers gem 与 user_spec.rb 一起使用:

describe User do
  ...
  it { should_not allow_mass_assignment_of(:admin) }
  ...
end

(这也不起作用),给出:

Failure/Error: it { should_not allow_mass_assignment_of(:admin) }
 NoMethodError:
   undefined method `active_authorizer' for #<Class:0x007f93c9840648>

(我认为这个错误是由于 shoulda-matchers 还不兼容 Rails 4)。

提前致谢!

【问题讨论】:

  • 目前看起来好像不行,得到:NoMethodError: undefined method `active_authorizer'(可能是由于 Rails 4 处于测试阶段)
  • describe User do it { should_not allow_mass_assignment_of(:admin) } end -------> 在上面使用它
  • 这对错误没有影响 - 我将更新问题以供参考。
  • 这是我对类似问题的回答:stackoverflow.com/a/26661956/2183673

标签: ruby-on-rails rspec rspec-rails ruby-on-rails-4


【解决方案1】:
it "should not allow mass assignment" do
  raw_parameters = { :admin => 1 }
  parameters = ActionController::Parameters.new(raw_parameters)
  expect {@user.update_attributes(parameters)}.should raise_error
end

为了测试质量分配,您应该模拟从控制器传递的参数。

https://github.com/rails/strong_parameters#use-outside-of-controllers

【讨论】:

  • 这仍然失败并出现故障/错误:它 { should_not be_admin } 预期管理员?返回false,得到true
  • 你的用户模型中是否有attr_accessibleattr_protected
  • 这是Rails 4,不再使用attr_accessible,因为它被强参数取代了? (所以,不,回答你的问题)
  • 对不起,也不起作用 - 在控制器中的 .permit 方法中,无论是否使用 :admin 都会通过。
  • 奇怪的是,即使将 :admin 添加到许可列表中,控制台中的代码也会引发:ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多