Rspec 在重定向后检查模板

moh*_*del 5 ruby rspec ruby-on-rails

这是我为用户创建的操作:

def create
        @user = User.new(user_params)

        if @user.save
            respond_to do |format|
                format.html { 
                    redirect_to edit_admin_user_path(@user) 
                    flash[:success] = "Successfully created"
                }
            end
        else
            render :new
            flash[:alert] = "Something went wrong"
        end
    end
Run Code Online (Sandbox Code Playgroud)

我的测试看起来像这样:

context "POST methods" do

    describe "#create" do
        it "renders the edit template" do
            post :create, user: FactoryGirl.attributes_for(:user)
            expect(response).to render_template(:edit)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

但是我收到这个错误:

Failures:

  1) Admin::UsersController POST methods #create renders the edit template
     Failure/Error: expect(response).to render_template(:edit)
       expecting <"edit"> but was a redirect to <http://test.host/admin/users/80/edit>
Run Code Online (Sandbox Code Playgroud)

我想检查创建用户后是否呈现 edit.html.haml 文件。我究竟做错了什么?

更新 #1 我确实在另一个测试中检查重定向,这是我的完整测试套件:

require 'rails_helper'

RSpec.describe Admin::UsersController, type: :controller do

    render_views    

    context "POST methods" do

        describe "#create" do
            it "using valid params" do

                expect{
                    post :create, user: { email: "something@hello.com", password: "long12345678" }
                    }.to change(User, :count).by(1)
                # get user_path('1')
            end

            it "redirects to the edit page after saving" do
                post :create, user: FactoryGirl.attributes_for(:user)
                user = User.last
                expect(response).to redirect_to(edit_admin_user_path(user.id))
            end

            it "renders the edit template" do
                post :create, user: FactoryGirl.attributes_for(:user)
                user = User.last
                expect {
                    redirect_to(edit_admin_user_path(user.id))  
                }.to render_template(:edit)
            end

            context "it redirects to new" do
                it "if user has no valid mail" do
                    post :create, user: { email: "something", password: "long12345678" }
                    expect(response).to render_template(:new)
                end
                it "if user has no valid password" do
                    post :create, user: { email: "something@mail.com", password: "short" }  
                    expect(response).to render_template(:new)
                end
            end
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

我想要的是实际检查编辑模板是否已呈现。因为用expect(response).to redirect_to(edit_admin_user_path(user))它不检查模板。即使我根本没有edit.html.haml 文件,该测试也会通过。

kta*_*ras 3

当您测试create操作时,您应该只检查重定向的正确性。在此操作中,您实际上并未渲染edit模板,而只是重定向到edit创建的实体的路径。所以这是你应该检查的事情。

describe "#create" do
    it "redirects to the edit path" do
        post :create, user: FactoryGirl.attributes_for(:user)
        expect(response).to redirect_to(edit_admin_user_path(User.last))
    end
end
Run Code Online (Sandbox Code Playgroud)

然后您应该进行另一个操作测试edit,检查模板渲染。这意味着在创建操作中重定向后,您还将看到正确的模板。