Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在ruby中对超时异常进行单元测试_Ruby On Rails_Ruby_Unit Testing - Fatal编程技术网

Ruby on rails 如何在ruby中对超时异常进行单元测试

Ruby on rails 如何在ruby中对超时异常进行单元测试,ruby-on-rails,ruby,unit-testing,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_negativ

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

我的方法如下所示:

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,但如何使该服务超时以检查超时用例???

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

例如:

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

现在您可以测试
true
false
nil

抑制异常通常不是我推荐给任何人的好做法

当您捕获(rescue)超时异常时,在rescue代码中重新引发它(或您自己的特定于应用程序的异常),并让调用方(您的测试)检查超时是否引发异常

例如,根据您使用的测试框架,您可以使用
assert\u raise
或expect
raise\u error


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

使用
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

您的方法有语法错误(在
def method
?)之后缺少begin)。@knut将
begin
添加到方法顶部可以修复语法错误,但是删除额外的
end
更可取(
def method;rescue;end
优于
def method;begin;rescue;end;end
)。