Почему RSPE C ведет себя по-разному между тестами Edit и New View с Rails 5.2? - PullRequest
0 голосов
/ 17 марта 2020

Я занимаюсь разработкой приложения на Rails 5.2 и тестирую функции с использованием Capybara.

Я хочу убедиться, что неподключенные пользователи не могут просматривать страницы Playgrounds, а подключенные - могут. Аутентификация основана на Devise, поэтому, когда вы запрашиваете неавторизованную страницу, вы перенаправляетесь на страницу входа.

Я написал этот тест: spec / features / playss_spe c .rb

require 'rails_helper'

RSpec.describe Playground, type: :request do
  include Warden::Test::Helpers

  describe "Playground pages: " do
    let(:pg) {FactoryBot.create(:playground)}

    context "when not signed in " do
      it "should propose to log in when requesting index" do
        get playgrounds_path
        follow_redirect!
        expect(response.body).to include('Sign in')
      end
      it "should propose to log in when requesting new" do
        get new_playground_path(pg)
        follow_redirect!
        expect(response.body).to include('Sign in')
      end
      it "should propose to log in when requesting edit" do
        get edit_playground_path(pg)
        follow_redirect!
        expect(response.body).to include('Sign in')
      end
      it "should propose to log in when requesting show" do
        get playground_path(pg)
        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)
        login_as test_user, scope: :user
      end
      it "should display index" do
        get playgrounds_path
        expect(response).to render_template(:index)
      end
      it "should display new view" do
        get new_playground_path(pg)
        expect(response).to render_template(:_form)
      end
      it "should display edit view" do
        get edit_playground_path(pg)
        expect(response).to render_template(:_form)
      end
      it "should display show view" do
        get playground_path(pg)
        expect(response).to render_template(:show)
      end
    end
  end
end

Тест должен быть успешным, но завершается неудачей со следующей ошибкой:

.F....#<Playground:0x000000000d119470>
.#<Playground:0x000000000e059700>
.

Failures:

  1) Playground Playground pages:  when not signed in  should propose to log in when requesting new
     Failure/Error: follow_redirect!

     RuntimeError:
       not a redirect! 401 Unauthorized
     # ./spec/features/playgrounds_spec.rb:17:in `block (4 levels) in <top (required)>'

Finished in 4.81 seconds (files took 12.28 seconds to load)
8 examples, 1 failure

Failed examples:

rspec ./spec/features/playgrounds_spec.rb:15 # Playground Playground pages:  when not signed in  should propose to log in when requesting new

Чтобы решить эту проблему, я могу просто проверить состояние, возвращаемое запросом в Новое представление:

  it "should propose to log in when requesting new" do
    get new_playground_path(pg)
    #follow_redirect!
    expect(response.status).to eq 401
  end

Но он не сообщает мне, действительно ли пользователь попадает на страница входа в систему ...

Еще одна деталь: когда не подключенный пользователь пытается получить доступ к этому новому представлению, он фактически попадает на страницу входа!

Можете ли вы объяснить почему поведение New View отличается и как решить эту проблему?

Большое спасибо!

1 Ответ

0 голосов
/ 25 марта 2020

Я наконец-то обнаружил, что метод new_playground_path не ожидает какого-либо параметра.

Я удалил выражение (pg), что окончательно решило проблему.

Решено!

...