在集成测试中,我有:
get activation_path("invalid token")
assert flash[:danger]
assert_redirected_to root_path
activation_path
指的是验证令牌的路径。正确的路径如下:get activation_path("valid token", inv: '10')
。因此,在测试中,链接不包含inv
的值,因此是无效链接。控制器方法使用inv
来查找邀请:
@invitation = Invitation.find(params[:inv])
所以预期的行为是无效链接产生闪存错误和重定向。但是,测试的第一行失败,错误为:
ActiveRecord :: RecordNotFound:找不到邀请' id' =
这是指控制器方法的第一个行,如上所述:
@invitation = Invitation.find(params[:inv])
为什么测试失败?我希望它只返回nil
@invitation
,但它会生成错误。我应该如何调整(控制器方法?)以考虑提交此类无效链接的用户?
更新:我也尝试过:
get activation_path("valid token", inv: '88888888888')
assert flash[:danger] # There's no invitation with that number
assert_redirected_to root_path
此测试也无法指向控制器方法的第一行:
ActiveRecord :: RecordNotFound:无法找到邀请 ' id'
的范围值
答案 0 :(得分:1)
根据Rails docs:
find方法将引发ActiveRecord :: RecordNotFound异常 如果没有找到匹配的记录。
默认情况下,Rails通过在生产和暂存中呈现404响应来响应ActiveRecord::RecordNotFound
错误。当用户访问不存在记录的URL时,这通常是所需的响应。
如果您希望它返回nil
而不是引发错误,请改为使用find_by_id
:
Invitation.find_by_id 0
=> nil