2014-03-03 40 views
35

有下面的代码:如何在Rails/RSpec中测试异常提升?

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 

CarBrand与ID等于0不存在,因此我的控制器代码引发的错误:: CarBrandNotFound,但我的测试代码,告诉我,什么也没有提高。我该如何解决它?我错了什么?

回答

57

为了规范错误处理,您的期望需要在块上设置;评估一个对象不会产生错误。

所以,你想要做这样的事情:

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

详见Expect error。尽管如此,我对你没有得到任何异常冒泡到你的规格结果感到有点惊讶。

+0

它没有帮助 – malcoauri

+0

@malcoauri再次使用更新的代码进行测试。 –

+0

结果相同 – malcoauri

11

get :index将永远不会引发异常 - 它会将某些方式的响应设置为500错误,如真实服务器所做的那样。

而是尝试:

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

为我工作的期望{}而不是指望()。

+0

值得指出的是,这样可以解决问题,因为{}语法会创建一个块来监视给定的异常情况。当检查一段代码引发异常时,MiniTest具有相似的语法要求。 – Argus9

+0

这样一个小小的改变。让我磨一会儿车轮。谢谢你。 – josh