我正在尝试在控制器上进行测试,如果在更新质量分配受保护的属性时它会引发错误。
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没有捕获异常?
答案 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中将采用不同的方法。