考虑一个简单的方法 -
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
)
正如预期的那样,这不起作用。还有其他方法吗?
谢谢!
答案 0 :(得分:0)
我不能完全回答这个问题,但是你可以按照这种方法,而不是做一个开始减少的事情,
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}}。