【发布时间】: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