无效链接在集成测试中崩溃,而不是产生flash错误消息



在集成测试中,我有:

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

最新更新