从我可以看到be_successful
是核心Rails和have_http_status
是RSpec的一部分。
是否有任何性能差异(或什么是首选约定):
expect(response).to have_http_status(:success)
expect(response).to be_successful
感谢对于你的性能问题,没有区别。与创建和处理对控制器的命中相比,两者之间字符串比较或堆栈深度的任何微小变化都是微不足道的。如果您正在与缓慢的测试作斗争,请将重点放在避免数据库写入(例如Model。构建而不是Model.create),并模拟出测试类之外的类的方法。
美学上,我认为expect(response).to be_successful
更切中要害。be_successful
的未来更新(甚至当前实现)可能会添加比http_status == 200
更有洞察力的测试或反馈。
我只会使用状态值检查,如果你出于某种原因对这个数字特别感兴趣,而不是成功命中的概念。
have_http_status
将显示更具体/更友好的错误消息,这有助于调试。正如前面的回答所指出的,性能差异在测试套件的总体方案中可以忽略不计。
Failure/Error: expect(response).to have_http_status(:success)
expected the response to have a success status code (2xx) but it was 400
与
Failure/Error: expect(response).to be_successful
expected `#<ActionDispatch::TestResponse:0x00005650d1daf0e8 @mon_data=#<Monitor:0x00005650d1daeb98>, @mon_data_..., @method=nil, @request_method=nil, @remote_ip=nil, @original_fullpath=nil, @fullpath=nil, @ip=nil>>.successful?` to return true, got false