ruby-on-rails - 如何使用 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 是否成功?
谢谢你的帮助。
解决方案
您应该在示例运行之前调用以下辅助方法,而不是调用实际的登录操作。
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
推荐阅读
- angular - 如何将列表拆分为列?
- javascript - 需要帮助,我们为什么需要它?
- javascript - 在 VS Code 中添加更好的调试语句以覆盖
- python - 我们应该使用 time.sleep() 还是 sleep()?
- python-3.x - matplotlib 直方图箱不反映数据
- python - 为什么使用 gspread 会出现无效范围错误
- java - 如何删除 Spring Jpa 和 Intellij Idea 中的数据源警告?
- xcode - Xcode 11 IB UI - 如何将约束分组设置恢复为 Xcode 10 方式
- java - 有没有办法模板抽象方法,以便抽象方法的参数的类型与实现子类相同?
- ruby - 为什么我们需要单独的 openssl.rb 文件?