RSpec 3 - 为了测试它而故意引发错误被拯救

时间:2015-04-01 05:05:05

标签: ruby-on-rails ruby rspec

考虑一个简单的方法 -

def my_method(users)
  eligible_users = []

  users.each do |u|
    # Go to the next user unless they are eligible
    next unless is_eligible?(u)

    begin
      update_user(u)
      eligible_users << u
    rescue
      puts "Error occured"
      # Prints some other stuff about error
      next
    end
  end
end

此方法的一个关键功能是,即使给定用户抛出错误,它也会循环访问用户,但会继续使用下一个用户。

如果我正在为此编写规范测试,我很乐意传递3个用户的数组,故意让第一个用户输出错误。然后,我可以检查第二个和第三个是否仍然正确处理。

我如何只为一个结果集而故意提出错误?

我以为我可以存根is_eligible?并为其中一个结果返回错误,并为剩余部分返回true -

allow_any_instance_of(MyClass).to receive(:is_eligible?).and_return(
  raise StandardError.new,
  true,
  true
)

正如预期的那样,这不起作用。还有其他方法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我不能完全回答这个问题,但是你可以按照这种方法,而不是做一个开始减少的事情,

  • 使update_user返回true或false。
  • 让一系列用户无法更新。
  • 返回
  • 之类的对象

response: { status: "failure", message: "falied to update #{pluralize(failed_users_array.count, 'user')}", failures: failed_users_array.join(", ") }表示失败和

response: { status: "success", message: "#{pluralize(users.count, 'user')} updated successfully" }取得所有成功。

现在你可以轻松测试,

  • 有两种情况,一种是你可以测试失败的,另一种是你可以测试所有成功的情况。

只需存根响应对象。

要提出错误,您必须.and_raise("some tezt or StandardError.new")进行{{1}}。