期望Rspec在控制器中引发异常

时间:2013-05-15 07:05:53

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

我正在尝试在控制器上进行测试,如果在更新质量分配受保护的属性时它会引发错误。

expect do 
  post :create, account: {protected_attr: "blahblah"}
end.to raise_error

然而,Rspec说:预期的例外,但没有提出任何内容

如果在spec文件中,我们删除了expect块,比如

post :create, account: {protected_attr: "blahblah"}

运行规范时会出现异常:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: protected_attr

为什么rspec的raise_error没有捕获异常?

2 个答案:

答案 0 :(得分:1)

问题在于您尝试在post :create, account: {protected_attr: "blahblah"}上获取例外,但所有这些代码都会返回http响应。

您无法在此处使用expect {}.to raise_exception

要测试异常,您不应该在控制器规范中执行此操作(我会在spec/models/account_spec.rb上执行此操作。例如:

expect do
  described_class.create!(protected_attr: 'blahblah')
end.to raise_exception

在您的控制器上,您只需测试响应代码即可获得成功:

post :create, account: {protected_attr: "blahblah"}

expect(response).to_not be_success
expect(response.status).to be(422) # you can be specific about the code you're expecting

答案 1 :(得分:0)

这不是您的问题的答案,但它可能会解决您的问题。你没有在控制器测试中测试它。只需在模型规格中测试即可。这是Rails 3.x中模型的一个问题。在Rails 4中将采用不同的方法。