Как войти в систему для запроса Rspec с сообщением new_user_session? - PullRequest
0 голосов
/ 10 мая 2019

Я пишу очень простой тест: отображается ли моя страница, когда мои пользователи вошли в систему? Я использую Factory для создания тестового пользователя и запрашиваю проверить случай:

FactoryBot.define do
  sequence(:login) {|n| "user#{n}"}
  sequence(:email) {|n| "user#{n}@gmail.com"}
  factory :user do
    playground_id       {0}
    default_playground_id {0}
    group_id            {0}
    first_name          {"user"}
    last_name           {"test"}
    user_name           {FactoryBot.generate :login}
    email               {FactoryBot.generate :email}
    password            {"DQtest_user01"}
    password_confirmation {"DQtest_user01"}
    description         {"This is a test User used for unit testing"}
    created_by          {"Rspec"}
    updated_by          {"Rspec"}
    active_from         {"2010.01.01"}
    active_to           {"2100.01.01"}
    confirmed_at        {Time.now}
  end
end

Если вы вошли в систему, шаблон индекса должен отображаться, в противном случае мы будем перенаправлены на форму sign_in (на основе Devise)

require 'rails_helper'

RSpec.describe BusinessArea, type: :request do

  describe "Business Areas pages: " do
    context "when not signed in " do
      it "should propose to log in" do
        get "/business_areas/index"
        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)
        post "/users/sign_in", :params => { user_login: test_user.user_name, user_password: test_user.password}
      end
      it "should display index" do
        get "/business_areas/index"
        expect(response).to render_template(:index)
      end
    end
  end
end

Форма, сгенерированная для входа, предоставляет Devise следующие поля:

      <label for="user_login">Login</label><br />
      <input autofocus="autofocus" type="text" name="user[login]" id="user_login" />
      <label for="user_password">Password</label><br />
      <input autocomplete="off" type="password" name="user[password]" id="user_password" />

Запуск теста возвращает это сообщение:

Неудачи:

1) Страницы BusinessArea Business Areas: при входе должно отображаться индекс Ошибка / Ошибка: ожидаем (ответ). To render_template (: index) ожидал <"index">, но был редирект на http://www.example.com/users/sign_in # ./spec/requests/business_areas_spec.rb:21:in `блок (4 уровня) в '

Завершено за 0,17126 секунды (загрузка файлов заняла 2,24 секунды) 2 примеры, 1 сбой

Это выглядит довольно просто, но я не понимаю, почему он не входит в систему? Или это другая проблема? Пользователь действительно создан, как я могу быть уверен, что FactoryBot успешен?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 10 мая 2019

Вы должны вызвать следующий вспомогательный метод перед запуском примера, вместо этого вызвать действительное действие входа в систему.

https://github.com/plataformatec/devise/wiki/How-To:-sign-in-and-out-a-user-in-Request-type-specs-(specs-tagged-with-type:-:request)

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

  context "when signed in" do
    before { login_as user, scope: :user }

    it "should display index" do
  end

...