RSpec 在期望 raise_error 之前期望一些东西

问题描述 投票:0回答:2

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

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
2个回答
6
投票

只需将它们放在同一个

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

0
投票

在单独的

it
中测试日志记录部分的另一种方法是使用suppress方法,所以它看起来像这样

it "logs the error" do
  suppress(MyError) do
    subject

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

it "raises MyError" do
  expect { subject }.to raise_error(MyError)
end
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.