Rspec - Достъп до методи/променливи на магьосничеството

Опитвам се да напиша някои тестове за код, който вече съм написал, с оглед на разширяване на моя код с помощта на разработка, управлявана от тестове.

Имам контролер, чието действие за индексиране извиква метод „user_info“, който просто събира заедно някои променливи на екземпляр, разчитайки на променливата current_user на Sorcery. Например:

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

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


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


Отговори (4)


За да използвате Sorcery test помощници, имате нужда от следните редове във вашия spec_helper.rb.

Следното трябва да бъде в блока Rspec.configure:

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

След като имате това на място, можете да използвате помощниците за теста на магьосничеството. За тест за контролер бихте добавили следното към вашия тест.

@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, това работи в горната част на моята спецификация на контролера за използване - let(:user) { u = FactoryGirl.create(:user) \n login_user(u) \n u } - person Alex; 07.01.2014

Ричард, проблемът вероятно е, че нямате current_user.

За да направите това, трябва да симулирате процеса на влизане.

Можете да направите това със спецификация на контролера, но нямам добър пример тук. Пишех спецификации на съществуващ код, като вас, и имаше смисъл вместо това да използвам спецификации на заявки.

Аз също нямам такъв за Sorcery (трябва!!) и тук използвам 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 }

край

Не е нужно да използвате фабрики, но трябва да установите тази сесия и current_user.

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