2017-02-20 3 views
1

Я новичок в Rspec, но мне удалось собрать рабочую (по крайней мере, в моих тестах) настройку, которая позволяет мне тестировать различные поведение в зарегистрированных/выведенных из системы состояниях с помощью помощников FactoryGirl + Devise и Warden. Поток выполняет следующие основные этапы:Как подписать пользователей для тестирования с помощью Rspec + Devise + FactoryGirl

  1. Factory девушка определяет общий пользователя
  2. Каждый тестовый блок, который требует входа использует ранее (: каждый) крюк, чтобы подписать пользователей в
  3. rails_helper конфигурации срывает входа пользователя после каждого теста с после: каждый крюк

Я искал много примеров кода, чтобы получить эту работу, но мне еще предстоит найти полный раунд и хотя я знаю, что это работает в моей настройке , Мне интересно, правильно ли это, в частности, я дублирую что-то ненужное (например, пользовательский знак в срывах) или создание будущего непредвиденного поведения.

Вот соответствующий код для каждого шага и испытания образца:

спецификации/factories.rb

FactoryGirl.define do 

    factory :user do 
    sequence(:name)  { |n| "person #{n}"} 
    sequence(:email)  { |n| "person#{n}@example.com" } 
    password    'foobar' 
    password_confirmation 'foobar' 
    confirmed_at   Time.now 
    sequence(:id)   { |n| n } 
    end 
end 

спецификации/rails_helper.rb

... 
    # Add login/logout helpers from Devise 
    config.include Devise::Test::ControllerHelpers, type: :controller 
    config.include Devise::Test::ControllerHelpers, type: :view 

    # Include Warden test helpers specifically for login/logout 
    config.include Warden::Test::Helpers 

    # Add capybara DSL 
    config.include Capybara::DSL 

    # Tear down signed in user after each test 
    config.after :each do 
    Warden.test_reset! 
    end 

SPEC/просмотров/static_pages (испытание образца)

RSpec.describe 'static_pages home, signed in', type: :view do 
    before(:each) do 
    @user = build(:user) 
    login_as(@user) 
    end 

    it 'should display the correct links when signed in' do 

    visit root_path 

    # links which persist in both states 
    expect(page).to have_link('Site Title', href: root_path, count: 1) 

    # links which drop out after login 
    expect(page).not_to have_link('Login', href: new_user_session_path) 
    expect(page).not_to have_link('Join', href: signup_path) 

    # links which are added after login 
    expect(page).to have_link('Add Item', href: new_item_path) 
    expect(page).to have_link('My Items', href: myitems_path) 
    end 
end 
+2

Что у вас хорошо выглядит. Я не уверен, что означает «кругосветное путешествие» в вашем контексте. FWIW, взгляните на [Тест функции RSPec] (https://www.relishapp.com/rspec/rspec-rails/docs/feature-specs/feature-spec). Это поддерживаемый механизм для общего дела, которое вы планируете делать, то есть тестирование на уровне объектов. –

+0

Это хороший совет, спасибо :) – oneWorkingHeadphone

ответ

2

Ваша установка полностью в порядке. Одна вещь, как @Greg Tarsa сказал, что вы можете захотеть выполнить такие тесты на уровне функциональности. Еще одна вещь от меня заключается в том, что нужно использовать один единственный образец для проверки одной единственной вещи, например. он должен быть одним (или несколькими) expect в блоке it. Но это не строгое правило - решать вам решать.

И я сделал некоторые рефакторинг вашей установки с предыдущими советами и синтаксисом в стиле функции. Может быть, было бы полезно:

background do 
    @user = build(:user) 
    login_as(@user) 
    visit root_path 
    end 

    scenario "links persist in both states" do 
    expect(page).to have_link('Site Title', href: root_path, count: 1) 
    end 

    scenario "links dropped out after login" do 
    expect(page).not_to have_link('Login', href: new_user_session_path) 
    expect(page).not_to have_link('Join', href: signup_path) 
    end 

    scenario "links added after login" do 
    expect(page).to have_link('Add Item', href: new_item_path) 
    expect(page).to have_link('My Items', href: myitems_path) 
    end 
+0

Очень полезно, и спасибо за рефактору! – oneWorkingHeadphone

Смежные вопросы