Вы должны действительно использовать запрос или функцию spe c вместо этого, поскольку они управляют полным стеком. Вы не только хотите проверить, что ваш контроллер перенаправляет куда-то - вы действительно хотите проверить, что перенаправляет куда-то и регистрирует пользователя. Желательно, не вставляя во внутренние органы или высмеивая фактический процесс аутентификации, который вы должны тестировать в первую очередь. ,
Обе команды RSpe c и Rails отказываются от написания тестов / спецификаций контроллера для новых приложений. Проверьте поведение вашего приложения. Не так, как он выполняет свою работу.
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
Или как запрос более низкого уровня spe c:
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