在集成测试中,我有:
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])
所以预期的行为是无效链接产生flash错误和重定向。但是,测试的第一行失败了,错误如下:
这是指控制器方法的第一行,如前所述为:ActiveRecord::RecordNotFound: could 't find Invitation with 'id'=
@invitation = Invitation.find(params[:inv])
为什么测试失败?我希望它只是为@invitation
返回nil
,但它会产生错误。我应该如何调整(控制器方法?)来考虑提交此类无效链接的用户?
更新:我也试过了:
get activation_path("valid token", inv: '88888888888')
assert flash[:danger] # There's no invitation with that number
assert_redirected_to root_path
这个测试同样指向控制器方法的第一行失败:
ActiveRecord::RecordNotFound: cannot find invite with an out'id'的范围值
根据Rails文档:
find方法将引发ActiveRecord::RecordNotFound异常如果没有找到匹配的记录。
默认情况下,Rails通过在生产和暂存在中呈现404响应来响应ActiveRecord::RecordNotFound
错误。当用户访问一个不存在的记录的URL时,这通常是期望的响应。
如果您希望它返回nil
而不是引发错误,请使用find_by_id
代替:
Invitation.find_by_id 0
=> nil