ruby RSpec中用户认证前的处理

yacmzcpb  于 2023-03-12  发布在  Ruby
关注(0)|答案(1)|浏览(166)

我正在用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: "foo@bar.com",
        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) }

我想我应该写这样的东西,但是如果有人知道,请给予我一些建议。谢谢你阅读这里。

z6psavjg

z6psavjg1#

解决了。通过使用factorybot将用户模型设置为“激活”来治愈。谢谢您的评论。

相关问题