RSpec中用户认证前的处理

问题描述 投票:0回答:0

我正在用 Rails 做一个应用程序。

我正在用 rspec 编写测试。我得到了一个错误。

我会先告诉你错误。

Failure/Error: expect(response).to redirect_to user_path(user)
     
       Expected response to be a redirect to <http://www.example.com/users/1> but was a redirect to <http://www.example.com/login>.
       Expected "http://www.example.com/users/1" to be === "http://www.example.com/login".
     # ./spec/requests/users_request_spec.rb:28:in `block (3 levels) in <top (required)>'

接下来我会告诉你测试


require 'rails_helper'

RSpec.describe "Users", type: :request do

  describe "PATCH /users/:id" do
    let(:user) { FactoryBot.create(:user) }

    before { log_in_as(user) }

it 'Successful edit with valid information entered' do
      patch user_path(user), params: { user: {
        name: "Foo Bar",
        email: "[email protected]",
        password: "",
        password_confirmation: "",
      } }
      expect(response).to redirect_to user_path(user)
    end
  end
end

在测试开始时显示 log_in_as(user) 方法。

spec/support/integration_helpers.rb

module IntegrationHelpers
    def is_logged_in?
      !session[:user_id].nil?
    end

    def log_in_as(user, password: 'password', remember_me: '1')
        post login_path, params: { session: { email: user.email,
                                              password: password,
                                              remember_me: remember_me } }
    end
  end

我建立了一个使用电子邮件激活帐户的系统。

这是一个会话控制器,只登录那些通过电子邮件验证其帐户的人。

app/controllers/sessions_controller.rb


class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      if user.activated?
        forwarding_url = session[:forwarding_url]
        reset_session
        params[:session][:remember_me] == '1' ? remember(user) : forget(user)
        log_in user
        redirect_to forwarding_url || user
      else
        message  = "Account not activated. "
        message += "Check your email for the activation link."
        flash[:warning] = message
        redirect_to root_url
      end
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new', status: :unprocessable_entity
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url, status: :see_other
  end
end


在介绍账户激活之前,第一个测试通过。 我认为您可能需要像测试助手的 log_in_as 方法一样对测试用户进行预验证。但我不知道怎么做。


before { log_in_as(user) } 

我想我应该写点类似的东西,但如果有人知道,请给我一些建议。感谢您阅读到这里。

ruby-on-rails ruby model-view-controller rspec
© www.soinside.com 2019 - 2024. All rights reserved.