如何在ruby中单元测试超时异常的方法

时间:2015-12-08 20:20:37

标签: ruby-on-rails ruby unit-testing

我想测试一个调用服务的方法,如果对该服务的调用超时我向用户显示负面反馈。如何对超时用例进行单元测试?

我的方法如下:

def method
  x = callservice()
  if x[:value]
    display_positve_feedback("positive")
  else
    display_negative_feedback("negative")
  end
  rescue Timeout::Error => e
    display_negative_feedback("Timeout, please wait for 5 mins and check again")
  end
end

我已经模拟了callservice但是如何使该服务超时检查超时用例???

3 个答案:

答案 0 :(得分:0)

您不使用返回代码。如果添加它,则可以测试方法结果。

示例:

def method
  begin
    x = callservice()
    if x[:value]
      display_positve_feedback("positive")
      return true
    else
      display_negative_feedback("negative")
      return false
    end
    rescue Timeout::Error => e
      display_negative_feedback("Timeout, please wait for 5 mins and check again")
      return nil
  end
  raise "This should never happen"
end

现在,您可以在truefalsenil上进行测试。

答案 1 :(得分:0)

抑制异常通常不是我推荐给任何人的好习惯。

当您捕获(救援)超时异常时,在救援代码中重新提升它(或您自己的应用程序特定的异常)并让调用者(您的测试)检查是否会因超时而抛出异常。

例如,您可以使用assert_raise或期望raise_error,具体取决于您使用的测试框架。

使用异常,调用代码只需知道潜在的异常,而不必检查特定的返回值,这使得代码更简单,更清晰。

答案 2 :(得分:0)

保留callservice方法以引发Timeout::Error。你将如何做到这一点取决于你正在使用的测试框架。例如,在RSpec中,它可能看起来像这样:

my_obj.stub(:callservice) { raise Timeout::Error }

expect(my_obj).to receive(:display_negative_feedback)
  .with("Timeout, please wait for 5 mins and check again")

my_obj.method