ruby-on-rails 如何在Rails/RSpec中测试异常引发?

jvidinwx  于 2023-03-31  发布在  Ruby
关注(0)|答案(4)|浏览(144)

代码如下:

def index
    @car_types = car_brand.car_types
end

def car_brand
    CarBrand.find(params[:car_brand_id])
rescue ActiveRecord::RecordNotFound
    raise Errors::CarBrandNotFound.new 
end

我想通过RSpec测试它。我的代码是:

it 'raises CarBrandNotFound exception' do
    get :index, car_brand_id: 0
    expect(response).to raise_error(Errors::CarBrandNotFound)
end

ID等于0的CarBrand不存在,因此我的控制器代码引发Errors::CarBrandNotFound,但我的测试代码告诉我没有引发任何内容。我如何修复它?我错了什么?

ni65a41a

ni65a41a1#

使用expect{}代替expect()
示例:

it do 
  expect { response }.to raise_error(Errors::CarBrandNotFound)
end
pb3s4cty

pb3s4cty2#

为了规范错误处理,您的期望需要设置在一个块上;计算对象不会引发错误。
所以你想做这样的事情:

expect {
  get :index, car_brand_id: 0
}.to raise_error(Errors::CarBrandNotFound)

我有点惊讶,你没有得到任何异常冒泡到你的规格结果,虽然。

ztigrdn8

ztigrdn83#

get :index永远不会引发异常--它会像真实的的服务器一样将response设置为500错误。
尝试:

it 'raises CarBrandNotFound exception' do
  controller.params[:car_brand_id] = 0
  expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound)
end
cuxqih21

cuxqih214#

如果您想测试异常沿着附带的消息,您还可以执行类似以下的操作:

it do 
  expect { response }.to raise_error(Errors::CarBrandNotFound, "Ford not found")
end

相关问题