Ruby on rails 会话控制器的Rspec

Ruby on rails 会话控制器的Rspec,ruby-on-rails,rspec,Ruby On Rails,Rspec,我正在尝试为会话控制器编写rspec。但我不能这样做 我想测试控制器的有效属性和无效属性。如果为特定用户传递了有效属性,则测试应通过;如果为给定用户传递了无效属性,则测试应失败 require 'rails_helper' RSpec.describe SessionsController, type: :controller do let(:user) { User.create(name: "some",email: 'other@example.com', password:

我正在尝试为会话控制器编写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
说明“无效属性”和“有效属性”不正常工作

如果电子邮件/密码错误,用户将重定向到会话#新页面


如果电子邮件和密码正确,用户应该重定向到用户路径,即用户显示页面。

当他们驱动整个堆栈时,您应该在此处真正使用请求或功能规范。您不仅要测试控制器是否重定向到某个位置,还需要测试控制器是否重定向到某个位置并让用户登录。最好不要戳到内部,也不要模拟您应该首先测试的实际身份验证过程

RSpec和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
或作为较低级别的请求规范:

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

你得到的错误是什么?这些规格测试你的应用程序实际应该如何设置。如果输入无效,则不应重定向回
/sessions/new
。它应该呈现新视图,最好返回一个响应代码,比如404-notfound,告诉客户端输入错误。