为什么 Rails RSpec 响应显示 302 而不是 401?

2024-02-07

我已经被这个问题困扰好几天了,我不知道它出了什么问题。几个月前我开始使用 Ruby on Rails,目前正在学习使用 API 进行身份验证。我看过其他类似的主题here https://stackoverflow.com/questions/9315992/expected-response-to-be-a-success-but-was-302 and there https://stackoverflow.com/questions/11391818/expected-response-to-be-a-success-but-was-302但他们都没有帮助。

我的问题是每当我在此代码上运行 RSpec (位于spec/api/v1/controllers/posts_controller_spec.rb)

require 'rails_helper'

RSpec.describe Api::V1::PostsController, type: :controller do
  let(:my_user) { create(:user) }
  let(:my_topic) { create(:topic) }
  let(:my_post) { create(:post, topic: my_topic, user: my_user) }

  context "unauthenticated user" do

    it "PUT update returns http unauthenticated" do
      put :update, topic_id: my_topic.id, id: my_post.id, post: {title: my_post.title, body: my_post.body}
      expect(response).to have_http_status(401)
    end
    ...

我不断得到

...
spec/api/v1/controllers/posts_controller_spec.rb -e "unauthenticated user"
Run options: include {:full_description=>/unauthenticated\ user/}
FFF

Failures:

  1) PostsController unauthenticated user PUT update returns http unauthenticated
     Failure/Error: expect(response).to have_http_status(401)
       expected the response to have status code 401 but it was 302
     # ./spec/api/v1/controllers/posts_controller_spec.rb:12:in `block (3 levels) in <top (required)>'

如果这有帮助的话,我的控制者,app/controllers/api/v1/posts_controller_spec.rb has

class Api::V1::PostsController < Api::V1::BaseController
  before_action :authenticate_user, except: [:index, :show]
  before_action :authorize_user, except: [:index, :show]


     def update
       post = Post.find(params[:id])

       if post.update_attributes(post_params)
         render json: post.to_json, status: 200
       else
         render json: {error: "Post update failed", status: 400}, status: 400
       end
     end
    ...

我的基地控制器

class Api::V1::BaseController < ApplicationController

  skip_before_action :verify_authenticity_token

  rescue_from ActiveRecord::RecordNotFound, with: :not_found
  rescue_from ActionController::ParameterMissing, with: :malformed_request

  def authenticate_user
    authenticate_or_request_with_http_token do |token, options|
      @current_user = User.find_by(auth_token: token)
    end
  end

  def authorize_user
    unless @current_user && @current_user.admin?
      render json: {error: "Not Authorized", status: 403}, status: 403
    end
  end

  def malformed_request
    render json: {error: "The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.", status: 400}, status: 400
  end

  def not_found
    render json: {error: "Record not found", status: 404}, status: 404
  end
end

最后,routes.rb 显示:

  namespace :api do
   namespace :v1 do
     resources :users, only: [:index, :show, :create, :update]
     resources :topics, except: [:edit, :new] do
       resources :posts, only: [:update, :create, :destroy]
     end
   end
 end

我有一种强烈的预感,我的 before_action 是罪魁祸首,但我无法确定我做错了什么。我使用类似的 RSpec 测试对主题(帖子嵌套在主题中)做了类似的事情,我的主题 RSpec 通过了,而我的帖子 RSpec 惨败。

有人可以帮我指出我做错了什么,以及如何通过 RSpec 测试而不显示 302 状态代码吗?

作为额外的,why是否显示 302 状态码?


问题是你正在使用

before_action :authenticate_user, except: [:index, :show],可能是 Devise 的帮手,对吗?如果是这样,当您尝试在未登录的情况下访问资源时,此帮助程序将redirect您进入登录页面,这是您使用浏览器时期望发生的事情,但这不是您的情况。您可以找到一些替代方案,覆盖设计行为,我的解决方案是定义我的authenticate_user!如果用户未登录,则使用另一个设计辅助方法返回 401 方法,如下所示:

def authenticate_user!
  if user_signed_in?
    @user = current_user
  else
    head :unauthorized
  end 
end 

这是对我有用的情况,你的可能会有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rails RSpec 响应显示 302 而不是 401? 的相关文章

随机推荐

  • 在 Q 中链接任意数量的 Promise

    我想发送 N 次 HTTP 请求 我希望最终获得有关每个请求的结果的信息 运行一次请求函数效果很好 这是使用 Q defer 的 HTTP 请求函数 function runRequest var deferred Q defer star
  • 专门用于 :hover 的元素覆盖 :active 的等效类

    我有代码为背景分配了一个类的字体颜色 然后有单独的类用于更改 hover 或 active 上的颜色 但 active 状态不会触发 除非我删除 hover 特定类 CODEPEN http codepen io bjackson2016
  • 如何在appengine中使用get_serving_url?

    以下是到目前为止我的 main py import cgi import datetime import logging from google appengine ext import db from google appengine a
  • 奇怪的 posix 消息队列链接问题 - 有时它无法正确链接

    当我构建以下代码时 它构建得很好 如果我更改代码以注释掉 while 使用相同的命令行 它不会构建 见下文 include
  • jqgrid如何添加多列排序?

    我可以向 jqgrid 添加单列排序 没问题 jqgrid如何添加多列排序 即先按第1列排序 再按第2列排序 最终排序顺序为 第2列 第1列 当前版本的jqGrid不支持多列排序 On http www trirand com blog h
  • 预加载浏览器剪贴板,用于使用 watir-webdriver 测试粘贴到字段中

    我们的 Web 应用程序有一些事件代码来 格式化 粘贴到字段中的任何文本 以便任何 HTML 样式都不会破坏我们的数据 预加载浏览器剪贴板以便我可以测试粘贴到输入字段的好方法是什么 有什么方法可以以编程方式执行此操作 或者我可以让测试脚本访
  • 无状态React如何传递密钥

    我不确定如何将密钥传递给无状态反应组件 MyComponent props gt return span props somevalue span aCollection map value index gt
  • 将 json 转换为对象列表时出现 ClassCastException

    我在用Jackson http jackson codehaus org 1 7 3 javadoc org codehaus jackson map ObjectMapper html处理json数据的库 我创建了一个generic将 j
  • 在构造函数中传递控制器总是不好的做法吗?

    我偶尔会通过传入视图控制器实例本身来实例化视图控制器中的类 以便我创建的对象可以调用控制器的方法来更新视图 这是总是 经常还是从来都不是一个坏习惯 具体来说 ViewController h 有 void updateButtonValue
  • 无法使用 VS2008 SP1 进入 .NET Framework 源代码

    不知何故 我的 VS2008 SP1 失去了进入 NET 框架源代码的能力 我一直在尝试使用复选框 我已经重新删除了符号缓存文件夹十几次 我尝试过各种调试符号服务器 它所做的只是下载一些 PDB 文件 但是当我尝试在 NET 中选择堆栈框架
  • 是否可以在 xelatex 中创建带有这样的数字的页脚?

    是否可以在 xelatex 中创建像上面这样的页脚 在第一页上要在右侧对齐的数字 在第二页上要在左侧对齐的数字 顶部边框是一个很好的补充 但不是必需的 我不需要数字旁边的任何文本 部分名称 documentclass 11pt a4pape
  • 检测 JSON 对象列表中的重复条目

    我有一个用 java 解析的 JSON 文件 它有几个对象列表 如下所示 phoneNumbers type home number 212 555 1234 type home number 212 555 1234 type fax n
  • 如何在asp.net core web api(无第三方)中实现JWT刷新令牌?

    我正在使用使用 JWT 的 asp net core 实现 Web api 我没有使用第三方解决方案 例如我正在尝试学习的 IdentityServer4 我已经让 JWT 配置正常工作 但对如何在 JWT 过期时实现刷新令牌感到困惑 下面
  • 如何使用git复制rails应用程序并部署到heroku

    我是编程和 Rails 的新手 我想创建一个我正在使用的 Rails 应用程序的副本 以无害地尝试一些东西 有没有一种简单的方法可以实现这一点 是的你可以 这些命令对于像我这样的新手来说并不明显 并且可能对其他人有帮助 首先 根据您计划调用
  • xDebug 和 PHPUnit 的代码覆盖率说是 100%,实际上不是

    我有以下功能 function foo p if p null throw new Exception bla if p null throw new Exception bla 我对此函数的测试没有涵盖抛出异常的行 但 PHPUnit 告
  • 在 Android 上使用 DU

    有没有类似于 unix 命令 du 我可以在 adb shell 上使用的东西 我正在尝试找到一种方法来查看每个文件有多大 因为我有一个应用程序变得非常大并且失去控制 并且我正在尝试确定它具体是哪个文件 数据库 以便我可以解决问题 我正在
  • 如何从 Ruby on Rails 输出 JSON?

    我希望有一个通过 AJAX 创建 更新的模型 在 Ruby on Rails 中如何做到这一点 另外 更具体地说 如何在 RoR 中输出 JSON def create response success gt false source So
  • 如何在Python中很好地打印出字典?

    我刚刚开始学习 python 正在构建一个文本游戏 我想要一个库存系统 但我似乎无法打印出字典而不使其看起来很丑 这是我到目前为止所拥有的 def inventory for numberofitems in len inventory c
  • 如何销毁tinyMce?

    我使用的是最新版本3 4 b3 我将它放在一个对话框中 它的内容是动态创建的 所以这意味着tiny 应该将自身绑定到的文本区域每次都会被创建 因此 当我第一次加载对话框时 会出现微小的情况 如果我第二次加载该对话框 该对话框将不会再次显示
  • 为什么 Rails RSpec 响应显示 302 而不是 401?

    我已经被这个问题困扰好几天了 我不知道它出了什么问题 几个月前我开始使用 Ruby on Rails 目前正在学习使用 API 进行身份验证 我看过其他类似的主题here https stackoverflow com questions