Rspec — Доступ к методам/переменным Sorcery

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

У меня есть контроллер, действие index которого вызывает метод user_info, который просто собирает вместе некоторые переменные экземпляра, полагаясь на переменную Sorcery current_user. Например:

def user_info
  @current_A = current_user.a
  @current_B = current_user.b
end

def index
  user_info
  // rest of the method goes here
end

Я начал писать несколько тестов с использованием rspec, просто чтобы получить представление о тестировании этой базы кода. Моя спецификация контроллера очень проста и выглядит так:

describe MyController do
  describe "GET 'index'" do
    get 'index'
    response.should be_success
  end
end

Однако при попытке запустить эту спецификацию я получаю следующую ошибку: NoMethodError: undefined method 'a' for false:FalseClass

Прежде всего, как мне заставить мою спецификацию распознавать метод Sorcery current_user? И, из любопытства, почему current_user помечен как экземпляр FalseClass? Если он не вызывает метод Sorcery (и я не определил current_user где-либо еще в своем коде), не должен ли он отображаться как nil?


person Richard Stokes    schedule 14.03.2012    source источник
comment
Всегда лучше принять лучший ответ или ответить на него самому и принять его. Спасибо   -  person Richard_G    schedule 12.08.2014


Ответы (4)


Чтобы использовать тестовые помощники Sorcery, вам нужны следующие строки в файле spec_helper.rb.

В блоке Rspec.configure должно быть следующее:

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails
end

После того, как вы это сделаете, вы можете использовать тестовые помощники Sorcery. Для теста контроллера вы должны добавить в свой тест следующее.

@user = either a fixture or a factory to define the user
login_user

Если вы не хотите указывать @user, вы можете передать аргумент.

login_user(fixture or factory definition)

После входа в систему current_user должен быть доступен для ваших тестов.

logout_user также доступен.

См. Sorcery Wiki для получения информации о настройке пользовательского прибора для работы с помощник login_user.

person nmott    schedule 30.03.2012
comment
после совета @nmott добавить помощника Sorcery в конфигурацию rpsec, это работает поверх моей спецификации контроллера Uses - let(:user) { u = FactoryGirl.create(:user) \n login_user(u) \n u } - person Alex; 07.01.2014

Ричард, скорее всего, проблема в том, что у вас нет файла current_user.

Для этого вам нужно смоделировать процесс входа в систему.

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

У меня также нет его для Волшебства (я должен!!), и я здесь использую Capybara для заполнения форм. Тем не менее, вот как выглядела моя спецификация:

(Здесь :account — это то же самое, что и :user)

 context "when logged in" do 

 before :each do
@account = Factory.create(:account)
@current_game = Factory(:game_stat)
visit login_path
    fill_in 'Username or Email Address', :with => @account.email
    fill_in 'Password', :with => @account.password
  click_button('Log in')

конец

Так что фабрики - другое дело, моя выглядела так:

Factory.define :account do |f|
 f.sequence(:username) { |n| "ecj#{n}" }
 f.sequence(:email) { |n| "ecj#{n}@edjones.com" }
 f.password "secret"
 f.password_confirmation {|u| u.password }

конец

Вам не нужно использовать фабрики, но вам нужно установить этот сеанс и текущий_пользователь.

person Ed Jones    schedule 14.03.2012

Важным моментом является обеспечение активации пользователя после создания, если вы используете подмодуль :user_activation в Sorcery.

Итак, если вы используете гем изготовления, это будет выглядеть так:

Fabricator(:properly_activated_user, :from => :user) do
  after_create { |user| user.activate! }
end
person agranov    schedule 18.05.2013

Как упомянул @nmott, вам нужно сделать две вещи:

1) Зарегистрируйте вспомогательные текстовые методы, используя:

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails
end

2) В вашем примере доступ к current_user через controller.current_user вот так:

login_user(user)
expect(controller.current_user).to be_present
person Konstantin Rudy    schedule 01.12.2013