预期响应的状态码为200,但在rsepc中的请求测试中为302

时间:2018-06-26 07:09:40

标签: ruby-on-rails rspec rspec-rails

我发现其他人发布了许多类似的问题,但是没有一个解决方案起作用。

我的/spec/requests/questions_spec.rb是

require 'rails_helper'
RSpec.describe "Questions", type: :request do
  describe "GET /questions" do
    it "works! (now write some real specs)" do
      get questions_path
      expect(response).to have_http_status(200)
    end
  end
end

现在我的rspec错误

Questions GET /questions works! (now write some real specs)
 Failure/Error: expect(response).to have_http_status(200)
   expected the response to have status code 200 but it was 302
 # ./spec/requests/questions_spec.rb:7:in `block (3 levels) in <top (required)>'

有人可以帮助我吗?如何自定义状态码200?

4 个答案:

答案 0 :(得分:3)

302 - Found。我认为您正在使用Rails脚手架。支架语法在get方法上返回302状态。如果需要200。您可以自定义代码。

答案 1 :(得分:2)

答案 2 :(得分:1)

当我正确修改此代码时,我遇到了类似expected the response to have a success status code (2xx) but it was 302的问题

描述“获取#index”的行为

  it "returns http success" do
    get :index
    expect(response).to have_http_status(:success)
  end
end

您知道我没有使用device的原因,所以我不能使用他妈的login_user,但是不幸的是,我已经完全忘记了如何实现登录实现。但是以某种方式使用session保持登录状态。所以我就这样工作了。

描述“获取#index”的行为

  it "returns http success" do

      admin = User.create(name:  "admin@gmail.com",
           email: "admin@gmail.com",
           password:              "admin@gmail.com",
           password_confirmation: "admin@gmail.com",
           admin:     true,
           activated: true,
           activated_at: Time.zone.now)

      session[:user_id] = admin.id

    get :index
    expect(response).to have_http_status(:success)
  end

end

答案 3 :(得分:0)

您很有可能会使用@Velusamy Venkatraman和@Raj提到的支架生成方法。因此,如果要获得2xx状态(这意味着完全成功),则需要sign_in。 302状态表示页面已存在,但您已被重定向(主要是在发生某些错误的情况下)。

执行以下操作以解决该问题:

步骤1: 您可以在spec文件夹中创建如下所示的自定义方法,然后简单地使用它们:

module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:admin]
      sign_in FactoryBot.create(:user, admin:true)
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      sign_in FactoryBot.create(:user)
    end
  end
end

第2步:

在需要和更改的地方,将login_userlogin_admin添加到规范文件中

let(:valid_session) { {} }

let(:valid_session) { {"warden.user.user.key" => session["warden.user.user.key"]} }

我希望您使用devisewarden,如果您不想担心会话/登录/注册问题,它们将非常有用。

您可以在此处查看其文档: plataformatec/devise wardencommunity/warden

此答案是根据devise的文档编写的: devise-wiki-how-to-test