Ruby on rails 如何使用RSpec测试Rails 4中的质量分配
给定一个简单的用户模型,在Rails4中,使用名称、电子邮件和管理布尔值,使用RSpec测试批量分配的最佳方法是什么 以下是UsersController:Ruby on rails 如何使用RSpec测试Rails 4中的质量分配,ruby-on-rails,rspec,rspec-rails,ruby-on-rails-4,Ruby On Rails,Rspec,Rspec Rails,Ruby On Rails 4,给定一个简单的用户模型,在Rails4中,使用名称、电子邮件和管理布尔值,使用RSpec测试批量分配的最佳方法是什么 以下是UsersController: def create @user = User.new user_params ...snip end private def user_params params.require(:user).permit(:name, :email) end 在测试这一点时有两种不同的尝试: 在用户_spec.rb中 de
def create
@user = User.new user_params
...snip
end
private
def user_params
params.require(:user).permit(:name, :email)
end
在测试这一点时有两种不同的尝试:
在用户_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
it 'should only allow name and email to be set' do
@controller.user_params.keys.should eq(['name', 'email')
end
或在用户\控制器\规范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
it 'should only allow name and email to be set' do
@controller.user_params.keys.should eq(['name', 'email')
end
这两项工作都没有——前者只是创建了一个admin设置为true(测试失败)的用户——这可能会绕过强_参数。后者可以工作,但只有在用户参数方法不是私有的情况下才能工作。(官方文件建议将其设置为private.Note-在用户规范中监视消息分配错误也不起作用(不会引发错误)
注意-实际上在视图中将用户设置为admin是正确的-admin属性被过滤掉了,所有人都很高兴,但是我真的希望看到它在测试中正常工作
另一种建议是与用户_spec.rb一起使用shoulda matchers gem:
describe User do
...
it { should_not allow_mass_assignment_of(:admin) }
...
end
(这也不起作用),给出:
失败/错误:它{应该不允许分配(:admin)}
命名错误:
未定义的“活动授权人”方法#
(我假设这个错误是因为shoulda matchers还不兼容Rails 4)
提前谢谢
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
为了测试质量分配,您应该模拟控制器传递的参数
看一看,目前这似乎不起作用,获取:NoMethodError:undefined方法'active\u authorizer'(可能是因为Rails 4处于测试阶段)描述用户做它{不应该允许(:admin)的大量分配}结束------->在顶部使用它对错误没有影响-我将更新问题以供参考。这是我发布到类似问题的答案:仍然失败/错误:它{不应该是{u admin}预期管理员?返回false,得到True您的用户模型中是否有
attr\u accessible
或attr\u protected
?这是Rails 4,attr\u accessible不再使用,因为它被强参数替换了?(因此,不,回答您的问题)很抱歉,这两种方法都不起作用-在控制器的.permit方法中不使用或使用:admin进行传递。奇怪的是,即使将:admin添加到许可列表中,控制台中的代码也会引发:ActiveModel::ForbiddenAttribute错误:ActiveModel::ForbiddenAttribute错误