Rspec 用于会话控制器
Rspec for sessions controller
我正在尝试为会话控制器编写 rspec。但是我做不到。
我想测试控制器的有效和无效属性。如果为特定用户传递了有效属性,则测试应该通过,如果为给定用户传递了无效属性,则测试应该失败。
require 'rails_helper'
RSpec.describe SessionsController, type: :controller do
let(:user) { User.create(name: "some",email: 'other@example.com', password: 'rous',password_confirmation: "some") }
describe "get login path" do
it "login page" do
get :new
expect(response).to render_template('sessions/new')
end
end
describe "valid attributes" do
it "create a session" do
post :create, session: { email: user.email, password: user.password }
expect(response.status).to render_template('/users/@user.id')
end
end
describe "invalid attributes" do
it "does not create a session" do
post :create, session: { email: user.email, password: "12345" }
expect(response.status).to render_template('sessions/new')
end
end
describe "does not create a session" do
it "if email is empty" do
post :create, session: {password: "some"}
expect(response.status).to render_template('sessions/new')
end
it "if password is empty" do
post :create, session: {email: "some@gmail.com"}
expect(response.status).to render_template('sessions/new')
end
end
end
描述 "invalid attributes" 和 "valid attributes" 工作不正常。
如果 email/password 错误,用户将重定向到 session#new 页面。
如果电子邮件和密码正确,用户应该重定向到 user_path 即用户显示页面。
您真的应该在这里使用请求或功能规范,因为它们驱动整个堆栈。您不仅想测试您的控制器是否重定向到某个地方 - 您真的想测试它重定向到某个地方并让用户登录。最好不要深入内部或模拟您应该首先测试的实际身份验证过程.
RSpec 和 Rails 团队都不鼓励为新应用程序编写控制器 tests/specs。测试应用程序的行为。不是它的工作方式。
require "rails_helper"
RSpec.feature "User sign in", type: :feature do
let!(:user) { FactoryBot.create(:user) }
scenario "User signs in with valid crentials" do
visit "/sessions/new"
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign In"
expect(page).to have_text "You have been signed in"
end
scenario "User signs in with invalid crentials" do
visit "/sessions/new"
fill_in "Email", with: user.email
fill_in "Password", with: "nottherightpassword"
click_button "Sign In"
expect(page).to_not have_text "You have been signed in"
expect(page).to have_text "Invalid email or password"
end
end
或作为较低级别的请求规范:
require "rails_helper"
RSpec.describe "Sessions", type: :request do
let!(:user) { FactoryBot.create(:user) }
describe "POST /sessions" do
context "with valid credentials" do
it "redirects the user" do
post '/sessions',
params: { session: { email: user.email, password: user.password } }
expect(response).to redirect_to user_path(user)
follow_redirect!
expect(response.body).to include("You have been signed in")
end
end
context "with invalid credentials" do
it "does not redirect the user" do
post '/sessions',
params: { session: { email: user.email, password: "nottherightpassword" } }
expect(response).to_not redirect_to user_path(user)
expect(response.body).to include("Invalid email or password")
end
end
end
end
我正在尝试为会话控制器编写 rspec。但是我做不到。
我想测试控制器的有效和无效属性。如果为特定用户传递了有效属性,则测试应该通过,如果为给定用户传递了无效属性,则测试应该失败。
require 'rails_helper'
RSpec.describe SessionsController, type: :controller do
let(:user) { User.create(name: "some",email: 'other@example.com', password: 'rous',password_confirmation: "some") }
describe "get login path" do
it "login page" do
get :new
expect(response).to render_template('sessions/new')
end
end
describe "valid attributes" do
it "create a session" do
post :create, session: { email: user.email, password: user.password }
expect(response.status).to render_template('/users/@user.id')
end
end
describe "invalid attributes" do
it "does not create a session" do
post :create, session: { email: user.email, password: "12345" }
expect(response.status).to render_template('sessions/new')
end
end
describe "does not create a session" do
it "if email is empty" do
post :create, session: {password: "some"}
expect(response.status).to render_template('sessions/new')
end
it "if password is empty" do
post :create, session: {email: "some@gmail.com"}
expect(response.status).to render_template('sessions/new')
end
end
end
描述 "invalid attributes" 和 "valid attributes" 工作不正常。
如果 email/password 错误,用户将重定向到 session#new 页面。
如果电子邮件和密码正确,用户应该重定向到 user_path 即用户显示页面。
您真的应该在这里使用请求或功能规范,因为它们驱动整个堆栈。您不仅想测试您的控制器是否重定向到某个地方 - 您真的想测试它重定向到某个地方并让用户登录。最好不要深入内部或模拟您应该首先测试的实际身份验证过程.
RSpec 和 Rails 团队都不鼓励为新应用程序编写控制器 tests/specs。测试应用程序的行为。不是它的工作方式。
require "rails_helper"
RSpec.feature "User sign in", type: :feature do
let!(:user) { FactoryBot.create(:user) }
scenario "User signs in with valid crentials" do
visit "/sessions/new"
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign In"
expect(page).to have_text "You have been signed in"
end
scenario "User signs in with invalid crentials" do
visit "/sessions/new"
fill_in "Email", with: user.email
fill_in "Password", with: "nottherightpassword"
click_button "Sign In"
expect(page).to_not have_text "You have been signed in"
expect(page).to have_text "Invalid email or password"
end
end
或作为较低级别的请求规范:
require "rails_helper"
RSpec.describe "Sessions", type: :request do
let!(:user) { FactoryBot.create(:user) }
describe "POST /sessions" do
context "with valid credentials" do
it "redirects the user" do
post '/sessions',
params: { session: { email: user.email, password: user.password } }
expect(response).to redirect_to user_path(user)
follow_redirect!
expect(response.body).to include("You have been signed in")
end
end
context "with invalid credentials" do
it "does not redirect the user" do
post '/sessions',
params: { session: { email: user.email, password: "nottherightpassword" } }
expect(response).to_not redirect_to user_path(user)
expect(response.body).to include("Invalid email or password")
end
end
end
end