首页 > 解决方案 > 如何使用 new_user_session 帖子登录 Rspec 请求?

问题描述

我正在编写一个非常简单的测试:当我的用户登录时是否显示我的页面?我使用工厂创建测试用户,并请求检查案例:

FactoryBot.define do
  sequence(:login) {|n| "user#{n}"}
  sequence(:email) {|n| "user#{n}@gmail.com"}
  factory :user do
    playground_id       {0}
    default_playground_id {0}
    group_id            {0}
    first_name          {"user"}
    last_name           {"test"}
    user_name           {FactoryBot.generate :login}
    email               {FactoryBot.generate :email}
    password            {"DQtest_user01"}
    password_confirmation {"DQtest_user01"}
    description         {"This is a test User used for unit testing"}
    created_by          {"Rspec"}
    updated_by          {"Rspec"}
    active_from         {"2010.01.01"}
    active_to           {"2100.01.01"}
    confirmed_at        {Time.now}
  end
end

如果已登录,则应显示索引模板,否则我们将重定向到 sign_in 表单(基于 Devise)

require 'rails_helper'

RSpec.describe BusinessArea, type: :request do

  describe "Business Areas pages: " do
    context "when not signed in " do
      it "should propose to log in" do
        get "/business_areas/index"
        follow_redirect!
        expect(response.body).to include('Sign in')
      end
    end
    context "when signed in" do
      before do
        get "/users/sign_in"
        test_user = FactoryBot.create(:user)
        post "/users/sign_in", :params => { user_login: test_user.user_name, user_password: test_user.password}
      end
      it "should display index" do
        get "/business_areas/index"
        expect(response).to render_template(:index)
      end
    end
  end
end

为登录生成的表单为设计提供以下字段:

      <label for="user_login">Login</label><br />
      <input autofocus="autofocus" type="text" name="user[login]" id="user_login" />
      <label for="user_password">Password</label><br />
      <input autocomplete="off" type="password" name="user[password]" id="user_password" />

运行测试返回此消息:

失败:

1) BusinessArea Business Areas 页面:登录时应显示 index Failure/Error: expect(response).to render_template(:index) expecting <"index"> 但重定向到http://www.example.com/users /sign_in # ./spec/requests/business_areas_spec.rb:21:in `block (4 levels) in '

在 0.17126 秒内完成(文件加载时间为 2.24 秒)2 个示例,1 个失败

它看起来很简单,但我不明白这一点:它为什么不登录?或者是另一个问题?用户是否实际创建,如何确定 FactoryBot 是否成功?

谢谢你的帮助。

标签: ruby-on-railsrspecfactory-bot

解决方案


您应该在示例运行之前调用以下辅助方法,而不是调用实际的登录操作。

https://github.com/plataformatec/devise/wiki/How-To:-sign-in-and-out-a-user-in-Request-type-specs-(specs-tagged-with-type:-:要求)

RSpec.describe BusinessArea, type: :request do
  include Warden::Test::Helpers

  context "when signed in" do
    before { login_as user, scope: :user }

    it "should display index" do
  end


推荐阅读