嘿 我试图使用Mocha和Rspec来测试方法总是引发一些异常的情况。
这是我试图测试的控制器代码:
def add_parent
begin
parent = Entity.find_by_id(params[:parent_id])
if !parent.nil?
@entity.add_parent!(parent)
flash[:success] = "Entity successfully updated."
else
raise "Parent does not exist."
end
rescue
flash[:error] = "Something bad happened. #{$!}"
end
redirect_to @entity
end
这是测试代码:
it "should flash error if exception is thrown when adding parent" do
Entity.any_instance.stubs(:add_parent!).raises(Exception)
lambda do
post :add_parent, :id => @entity[:id],
:parent_id => @parent_entity[:id]
end.should_not change(@entity.parents, :count)
flash[:error].should =~ /something bad happened/i
end
以下是存根的方法:
def add_parent!(parent)
Entity.transaction do
lock!('lock in share mode')
self.parents << parent
end
end
我收到以下rspec错误,这是非常缺乏信息,所以我不知道如何解决它..
Failures:
1) EntitiesController POST 'add_parent' for signed-in users allow access with edit permission should flash error if exception is thrown when adding parent
Failure/Error: post :add_parent, :id => @entity[:id],
Exception
# ./app/controllers/entities_controller.rb:81:in `add_parent'
# ./spec/controllers/entities_controller_spec.rb:1010
答案 0 :(得分:0)
首先,如果不提供您期望的异常类,从大量代码中拯救是一种非常糟糕的习惯。救援一切都没有好处。最好删除整个救援,也许使用find
而不是find_by_id
,因此rails可以捕获404错误并且您不会被打扰。另一方面,这个错误是否应该发生很多?看起来有些db-stuff正在进行,所以我不希望它失败。
其次,我认为你必须像手册那样测试raise_error
http://relishapp.com/rspec/rspec-expectations/v/2-6/dir/built-in-matchers/raise-error-matcher
答案 1 :(得分:0)
rescue
将拯救StandardError及其后代。如果要捕获所有异常,则应rescue Exception
,因为所有异常都来自异常类。