Rspec - Доступ к методам / переменным Волшебства - PullRequest
2 голосов
/ 14 марта 2012

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

У меня есть контроллер, действие 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: неопределенный метод 'a' для false: FalseClass

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

Ответы [ 4 ]

3 голосов
/ 30 марта 2012

Для использования помощников по тестированию Волшебства вам нужны следующие строки в вашем spec_helper.rb.

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

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

После этогона месте вы можете использовать помощников теста Волшебства.Для теста Controller вы добавили бы в ваш тест следующее:

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

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

login_user(fixture or factory definition)

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

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

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

0 голосов
/ 01 декабря 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
0 голосов
/ 18 мая 2013

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

Так что, если вы используете гем изготовления, это будет выглядеть так1003 *

Fabricator(:properly_activated_user, :from => :user) do
  after_create { |user| user.activate! }
end
0 голосов
/ 14 марта 2012

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

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

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

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

(Здесь: аккаунт такой же, как и у пользователя)

 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')

end

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

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 }

end

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

...