Как заглушить атрибуты текущего пользователя в спецификации представления

У меня есть спецификация представления, в которой я тестирую условный вывод. Как мне получить спецификацию, чтобы вернуть пользователя, которого я издевался?

Просмотреть файл:

.content
 - if @current_user.is_welcome == true
  Welcome to the site 

Просмотреть спецификацию:

before(:each) do 
  @user = mock_model(User)
  @user.stub!(:is_welcome).and_return(true)
  view.stub(:current_user).and_return(@user) 
end

it "show content" do 
  #assign(:current_user, stub_model(User, dismiss_intro: true))
  render
  rendered.should have_content("Welcome to the site")
end

Запуск спецификации возвращает undefined method is_welcome for nil:NilClass


person Simpleton    schedule 08.09.2012    source источник


Ответы (2)


Вы заглушили метод с именем current_user, а не переменную экземпляра @current_user.

view.stub(:current_user).and_return(@user)

Это означает, что в представлении вы должны использовать:

.content
 - if current_user.is_welcome == true
  Welcome to the site

Обратите внимание, что он вызывает метод current_user вместо получения переменной экземпляра @current_user.

Если вам нужна переменная экземпляра, рекомендуется создать метод current_user, который получает переменную экземпляра и возвращает ее.

person ronalchn    schedule 08.09.2012
comment
Мой ApplicationController возвращает переменную экземпляра helper_method :current_user, которая возвращает @current_user. Я просто не думаю, что понимаю стабирование. - person Simpleton; 08.09.2012
comment
вы заглушили метод, но пытаетесь получить доступ к переменной. Переменная nil, потому что она не была инициализирована. - person ronalchn; 08.09.2012
comment
вы не должны/не можете. Вот почему я говорю, чтобы изменить ваше мнение. - person ronalchn; 08.09.2012

В итоге я сделал это, что позволило мне сохранить переменную @current_user в моем представлении и выполнить спецификацию:

before :each do
  @user = stub_model(User, is_welcome: true)
  assign(:current_user, @user)
end

Затем, чтобы проверить условность, просто запустите другую спецификацию в контексте с другим блоком before:

before :each do
  @user = stub_model(User, is_welcome: false)
  assign(:current_user, @user)
end
person Simpleton    schedule 08.09.2012