Rspec для проверки того, вошел ли пользователь в рельсы или нет, используя devise gem - PullRequest
0 голосов
/ 05 сентября 2018

Я использовал devise gem в rails для аутентификации пользователя. Мне нужно написать контрольные примеры для проверки того, вошел ли пользователь в Rspec или нет. Только пользователь, вошедший в систему, будет иметь права доступа к странице индекса сообщений. Он идеально подходит для пользователя, вошедшего в систему в Rspec. Но для пользователя, вышедшего из системы, я попытался сделать несколько шагов, но не могу сделать это правильно. Я использовал Warden для простой аутентификации в целях тестирования. Моя спецификация пост-контроллера для пользователя, вышедшего из системы:

describe "Unauthorized Access" do
    let(:user) {create(:user)}
    it "User tries to view post after Sign Out" do
      get :index
      expect(response).to have_http_status 401
    end
  end

Помощник начальника в папке spec.

RSpec.shared_context "api request global before and after hooks" do
  before(:each) do
    Warden.test_mode!
  end

  after(:each) do
    Warden.test_reset!
  end
end

RSpec.shared_context "api request authentication helper methods" do
  def sign_in(user)
    login_as(user, scope: :users)
  end

  def sign_out
    logout(:users)
  end
end
Когда я нажимаю кнопку выхода, она перенаправляется на страницу входа в систему, и журнал рельсов показывает журнал, подобный этому

Started GET "/" for 127.0.0.1 at 2018-09-05 11:33:10 +0530
Processing by PostsController#index as HTML
Completed 401 Unauthorized in 2ms (ActiveRecord: 0.0ms)


Started GET "/users/sign_in" for 127.0.0.1 at 2018-09-05 11:33:10 +0530
Processing by Devise::SessionsController#new as HTML
  Rendering devise/sessions/new.html.erb within layouts/application
  Rendered devise/shared/_links.html.erb (0.9ms)
  Rendered devise/sessions/new.html.erb within layouts/application (5.0ms)
Completed 200 OK in 69ms (Views: 67.9ms | ActiveRecord: 0.0ms)
Но когда я запускаю тесты, на консоли rspec выдается ошибка.

expected the response to have status code 401 but it was 302

  0) PostsController Unauthorized Access User tries to view post after Sign Out
     Failure/Error: expect(response).to have_http_status 401
       expected the response to have status code 401 but it was 302
     # ./spec/controllers/posts_controller_spec.rb:150:in `block (3 levels) in <top (required)>'
Rspec log

  (0.1ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
   (0.4ms)  begin transaction
Processing by PostsController#index as HTML
Completed 401 Unauthorized in 8ms (ActiveRecord: 0.0ms)
   (0.1ms)  rollback transaction

1 Ответ

0 голосов
/ 05 сентября 2018

Вы должны пройти тестирование следующим образом, внести изменения в соответствии с вашим требованием.

describe PostsController do

  describe "Index" do

    it "should allow user to view the list of posts" do
      get :index, {}, sign_in(@user)
      expect(response).to redirect_to(posts_path)
    end

    it "should not list posts if the user is not logged in" do
      get :index
      expect(response.status).to eq(302)
      expect(response).to redirect_to(new_user_sessions_path)
    end
  end

end

Теперь, что будет делать этот тест, при запуске он вызовет ваш контроллер, при условии, что вы поставили authenticate_user!, он проверит, вошел ли пользователь в систему или нет, чтобы просмотреть список. В противном случае action вернет 401.

Вы также можете попробовать следующее

  RSpec.describe "Posts", :type => :request do
    context "Index" do
      it 'should return 401 when not logged in' do
        sign_out user
        get posts_path
        expect(response).to have_http_status(302)
        follow_redirect!
        expect(response).to have_http_status(401)
      end
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...