Ruby脚本引发意外的回溯

时间:2015-03-20 16:13:02

标签: ruby rspec error-handling

我有一个方法应该使用消息引发自定义错误。当我捕获错误并引发我自己的自定义错误时,它仍然会提升并打印原始错误的回溯。我只想要自定义错误和消息。代码如下。

方法:

def load(configs)
  begin
    opts = {access_token:  configs['token'],
           api_endpoint:  configs['endpoint'],
            web_endpoint:  configs['site'],
            auto_paginate: configs['pagination']}

    client = Octokit::Client.new(opts)

    repos = client.org_repos(configs['org'])
    repos.each do |r|
      Project.create(name: r.name)
    end
  rescue Octokit::Unauthorized
    raise GitConfigError, "boom"
  end
  #rescue Octokit::Unauthorized
end

class GitConfigError < StandardError
end

我的测试(这是令人讨厌的):

 context 'with incorrect git configs' do
   before do
     allow(loader).to receive(:load).and_raise Octokit::Unauthorized
   end

   it { expect{loader.load(configs)}.to raise_error(GitConfigError, "boom" ) }
 end

测试输出:

GitProjectLoader#load with incorrect git configs should raise GitConfigError with "boom"
 Failure/Error: it { expect{loader.load(configs)}.to raise_error(GitConfigError, "boom" ) }
   expected GitConfigError with "boom", got #<Octokit::Unauthorized: Octokit::Unauthorized> with backtrace:
     # ./spec/lib/git_project_loader_spec.rb:24:in `block (5 levels) in <top (required)>'
     # ./spec/lib/git_project_loader_spec.rb:24:in `block (4 levels) in <top (required)>'
 # ./spec/lib/git_project_loader_spec.rb:24:in `block (4 levels) in <top (required)>'

2 个答案:

答案 0 :(得分:2)

如果您打算测试Octokit::Unauthorized错误的处理,那么在rescue开始之前的任何地方都会引发错误。最好是在某个地方实际提出错误。

像这样的东西,例如:

before do
  allow(Octokit::Client).to receive(:new).and_raise(Octokit::Unauthorized)
end

然后:

expect{ loader.load(configs) }.to raise_error(GitConfigError, "boom" )

作为旁注,我不鼓励在begin;rescue;end结构中包含方法的所有行;你应该只包括你期望错误的行。

答案 1 :(得分:1)

您没有按照自己的想法测试代码。你嘲笑过它。

该行

allow(loader).to receive(:load).and_raise Octokit::Unauthorized

load上的loader方法替换为只会引发命名错误的存根。

删除before块,它应该按预期测试您的代码。注意如上所述,它将通过Octokit发出真实的请求,除非你嘲笑它。