使用异常引发代码运行RSpec示例而不使用raise_error

时间:2015-11-17 21:39:01

标签: ruby-on-rails ruby rspec rspec3

要测试代码是否使用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

1 个答案:

答案 0 :(得分:0)

我认为你写它的方式没有错。如果您不想在同一个测试中测试多个断言,那么您可以拆分它们,但如果测试触发了异常,您必须期望它。

那是你问的吗?

顺便说一下,只是raise_error是一个不好的做法。最好将它传递给你期望的正确的异常类,例如:

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