测试在RSpec中重定向的请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试在RSpec中重定向的请求相关的知识,希望对你有一定的参考价值。

我正在尝试测试一个post请求,如果成功则重定向:

class PostsController < ApplicationController
  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to @post, notice: 'Post was successfully created.'
    else
      render :new
    end
  end
end

我想知道是否可以测试是否在重定向之前收到201响应代码。这是我目前如何拥有我的代码。这将是错误的,因为重定向首先发生:

RSpec.describe 'Posts', type: :request do
  describe 'POST #create' do
    it 'has a 201 response code' do
      post posts_path, params: { post: valid_attributes }

      expect(response).to have_http_status(201)
    end
  end
end
答案

如果params有效,您可以检查是否创建了帖子并且用户是否被重定向。如果你在Post模型中有任何验证,最好测试无效参数:

RSpec.describe 'PostsController', type: :request do
  describe 'POST #create' do
    context 'with valid params' do
      it 'creates a new post' do
        expect { post posts_path, params: { post: valid_attributes } }.to change(Post, :count).by(1)        
        expect(response).to redirect_to post_path(Post.last)
      end
    end

    context 'with invalid params' do
      it 'does not create a new post' do
        expect { post posts_path, params: { post: invalid_attributes } }.not_to change(Post, :count)
        expect(response).to have_http_status 200
      end
    end
  end
end
另一答案

自成功创建帖子以来,您的响应代码将为302。在您给出的示例代码中,您将无法获得201。您可以检查您是否收到201

expect(response).to_not have_http_status(201).

创建新的Post模型不会返回HTTP状态代码。它在数据库中创建一行。如果要检查是否创建了帖子,您可以检查在测试开始时帖子的数量是0,在结尾时是1。

以上是关于测试在RSpec中重定向的请求的主要内容,如果未能解决你的问题,请参考以下文章

Rails/Rspec - 在控制器中测试重定向

在 laravel 5.3 中重定向回请求的页面

在网站前面使用反向代理将 http 请求从 iframe 中重定向到网站

如何在 Ajax 请求中重定向回 Laravel 8 中的错误

在某些 RSpec rails 请求示例中测试 HTTP 状态代码,但在其他示例中测试引发异常

在 chrome 响应式模拟器中重定向更改用户代理