【问题标题】:RSpec expect something before expect raise_errorRSpec 在期望 raise_error 之前期望一些东西
【发布时间】:2021-02-10 20:52:55
【问题描述】:

想象一下有一种方法可以拯救并进行一些日志记录。

def do_something
  # do stuff
  some_client.call(var1)
rescue StandardError => e
  # log some stuff.
  Rails.logger.error("#{self.class} - Var 1 is #{var1}.") if e.is_a?(MyError)

  raise
end

然后在 RSpec 中,我想

  • 断言错误已引发。
  • 它会记录错误
before do
  allow(Rails.logger).to receive(:error)
  allow(some_client).to receive(:call).and_raise(MyError)
end

it "logs the error" do
  subject

  expect(Rails.logger).to have_received(:error).with(/some message with var1/)
end

it "raises MyError" do
  expect { subject }.to raise_error(MyError)
end

expect { subject }.to raise_error(MyError) 部分按预期工作,但我应该如何断言日志记录?使用上面的示例代码,RSpec 将在引发的错误上报告错误而不断言日志记录。

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    只需将它们放在同一个it 中即可。预计它会引发错误并记录它。

    it "raises MyError and logs it" do
      expect { subject }.to raise_error(MyError)
      expect(Rails.logger).to have_received(:error).with(/some message with var1/)
    end
    

    或者,如果您真的想检查它是否将错误记录在单独的 it 中,则必须挽救错误。否则您的规范将失败(未处理的错误)

    it "logs the error" do
      subject
    rescue
    ensure
      expect(Rails.logger).to have_received(:error).with(/some message with var1/)
    end
    

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多