【问题标题】:Run an RSpec example with exception-raising code without raise_error使用不带 raise_error 的异常引发代码运行 RSpec 示例
【发布时间】:2015-11-17 21:39:01
【问题描述】:

要使用 RSpec 测试代码是否引发异常,您可以使用带有 raise_error 的块:

it "raises an exception" do
  expect { raise_an_exception }.to raise_error
end

假设您想测试引发异常的代码是否也执行其他操作。您必须始终使用上述语法吗?

# testing whether an error is raised
it "reraises exceptions" do
  expect { log_exception_and_reraise }.to raise_error(ExceptionClass)
end

# not testing whether an error is raised
it "logs errors" do
  expect(Rails.logger).to receive(:error)
  expect { log_exception_and_reraise }.to raise_error
end

# not testing whether an error is raised
it "sends errors to error tracker"
  expect(ErrorTracker).to receive(:send_error)
  expect { log_exception_and_reraise }.to raise_error
end

这行得通,但是您在每个示例中都测试了两个不同的东西(即使您不想这样做)。而且你必须为每个人复制raise_error 的期望。

我宁愿做类似的事情

it "sends errors to error tracker"
  expect(ErrorTracker).to receive(:send_error)
  execute { log_exception_and_reraise }
end

【问题讨论】:

  • 如果您希望引发错误,您是否需要将代码块传递给expect?如果是,那么是的,它必须是 RSpec 处理异常的代码块。

标签: ruby-on-rails ruby rspec rspec3


【解决方案1】:

我觉得你写的没什么问题。如果您不想在同一个测试中测试多个断言,那么您可以将它们拆分,但如果测试触发了异常,您必须期待它。

这是你问的吗?

顺便说一句,只使用 raise_error 是一种不好的做法。最好将您期望的正确异常类传递给它,例如:

expect { log_exception_and_reraise }.to raise_error(ActiveRecord::RecordNotFound)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多