【发布时间】:2013-02-13 10:57:33
【问题描述】:
我认为这很简单,但我在测试 rack-timeout gem 时遇到了问题。我有一个带有端点的 sinatra 基类,它执行一些逻辑。
module MyModule
class MySinatra < Sinatra::Base
use Rack::Timeout
Rack::Timeout.timeout = 10
get '/dosomething' do
#do the normal logic.
end
end
end
有关 rack-timeout gem 的更多信息是here。我正在尝试设置一个测试,我可以在其中发送一个我知道需要几秒钟才能失败的请求。
这是目前的测试
require "test/unit"
require "mocha/setup"
require 'rack/timeout'
def test_rack_timeout_should_throw_timed_out_exception_test
Rack::Timeout.stubs(:timeout).returns(0.0001)
assert_raises TimeoutError do
get "/dosomething"
end
Rack::Timeout.unstub
end
有很多方法可以做到这一点,但我不确定它们将如何实施
- 将“/dosomething”方法作为测试的一部分覆盖到{sleep 3}
- 与上述相同,但使用存根或模拟库
- 不要在测试中使用 get "/dosomething",而是创建一个 net::http 响应以保持请求打开。
对此的任何想法将不胜感激。
【问题讨论】:
-
存根有什么问题(仅用于超时测试)?
-
@padde 这已经在代码中完成了。超时设置为 0.0001。除非测试超时是一个非常小的数字 EG 0.000000000000000000000001(比进程在机器上可以处理的速度更快),否则测试将始终失败。此外,更快的机器将比其他机器更快地处理“/dosomething”方法。所以在某些机器上,测试会超时(这是我们想要的),而在其他较慢的机器上,测试会成功。
-
抱歉,我的意思是用至少与超时时间一样长的睡眠调用覆盖
get '/dosomething'有什么问题? -
@padde 我已经将此列为潜在的解决方案(第 2 号)。但是我不确定它会如何实现。
标签: ruby sinatra rack ruby-mocha rack-test