要测试代码是否使用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
答案 0 :(得分:0)
我认为你写它的方式没有错。如果您不想在同一个测试中测试多个断言,那么您可以拆分它们,但如果测试触发了异常,您必须期望它。
那是你问的吗?
顺便说一下,只是raise_error是一个不好的做法。最好将它传递给你期望的正确的异常类,例如:
expect { log_exception_and_reraise }.to raise_error(ActiveRecord::RecordNotFound)