【发布时间】:2011-08-26 17:29:06
【问题描述】:
我想测试我在 Sinatra 上制作的这条路线:
get '/party' do
begin
party_source.parties
rescue Exceptions::SourceNotFoundError
status 404
rescue Exceptions::SourceInternalError
status 503
end
end
我编写了这个测试(假设测试可以访问party_source,在实际代码中是这样):
require 'rack/test'
def test_correct_status_code_when_get_error_404
source_404 = mock()
source_404.expects(:parties).with(nil).raises(Exceptions::SourceNotFoundError)
MyApp.party_source = source_404
get '/party'
assert_equal 404, last_response.status
end
当我运行此测试时,它失败了,因为我没有得到 404(我的代码),而是得到状态 500。无论我提出什么异常,我总是得到状态 500,我认为这是由 Sinatra 或 Rack 生成的。
我该如何测试这个案例?
更新
据我所知,异常并没有被我的救援块捕获。 Rack 或 Sinatra 正在获取它并处理 HTTP 状态 500 响应消息。
我无法理解我的救援代码块是如何被忽略的。
【问题讨论】:
-
那么我要测试的是不常见的吗? 5天内没有答案。有什么我可以更好地解释的吗?
-
不是没有捕获到异常,而是你只捕获了两类异常。使用
rescue Exception在开始/救援块的末尾添加一个总称,您将很快发现问题出在哪里。 -
你好 Benoit,你是对的。问题是模拟对象引发了另一个异常。如果您想发布答案,我可以将其标记为正确。谢谢!
-
完成,我编辑了我之前的答案。谢谢!
标签: ruby unit-testing sinatra rack