Рельсы помощников URL-адрес не работает в для RSpec
Я новичок в программировании, это мое первое приложение. При создании приложения в Rails у меня есть две модели. Пользователь и список, вложенные.
resources :users do
resources :lists
end
Это следующие маршруты, которые я получаю с этой настройкой:
user_lists GET /users/:user_id/lists(.:format) lists#index
POST /users/:user_id/lists(.:format) lists#create
new_user_list GET /users/:user_id/lists/new(.:format) lists#new
edit_user_list GET /users/:user_id/lists/:id/edit(.:format)lists#edit
user_list GET /users/:user_id/lists/:id(.:format) lists#show
PUT /users/:user_id/lists/:id(.:format) lists#update
DELETE /users/:user_id/lists/:id(.:format) lists#destroy
В отношении я создал представления со следующими ссылками.
<div class="stats">
<a href="<%= user_lists_path(current_user) %>">
<%= pluralize(current_user.lists.count, 'List') %>
</a>
</div>
<div class="list">
<%= link_to 'Create List', new_user_list_path(current_user) %>
</div>
Они работают, как и ожидалось, однако, когда я использую те же помощники url в тестировании, я получаю ошибку.
describe "List create page" do
let(:user) { FactoryGirl.create(:user) }
before do
user.save
visit new_user_list_path(user)
end
it { should have_selector('title', text: 'SocialTask | List') }
it { should have_selector('h1', text: 'Create list') }
describe "invalid list creation" do
before { click_button 'Create list' }
it { should have_content('Error in creating list') }
end
end
Это приводит к ошибке тестов.
Failure/Error: visit new_user_list_path(user)
NoMethodError:
undefined method `lists' for nil:NilClass
Я пытался игра с url-адресом, который не работал. Я попытался обновить rspec / capybara, что тоже не сработало. Я также проверил включение
config.include Rails.application.routes.url_helpers
В spec helper.
Как заставить помощников работать? Или я упустил какую-то незначительную деталь? Заранее спасибо.
Вспомогательные Методы.
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
def signed_in?
!current_user.nil?
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
def current_user?(user)
current_user == user
end
end
Помощник rspec для входа. поддержка / утилиты.rb
include ApplicationHelper
def sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
cookies[:remember_token] = user.remember_token
end
2 ответа:
Не видя трассировки стека, я думаю, что ваша проблема заключается в представлении на этой строке:
<%= pluralize(current_user.lists.count, 'List') %>
Похоже, что
current_user
равно нулю. Обычно вы должны определить какой-то вспомогательный метод в вашем наборе RSpec для имитации входа пользователя в систему. Таким образом,current_user
вернет пользователя, которого вы заглушили в тесте.Вот пример:
# spec/support/session_helper.rb module SessionHelper def login(username = 'admin') request.session[:user_id] = User.find_by_username(username).id end end
Ваш будет отличаться в зависимости от способа аутентификации пользователей. Например, Devise публикует свой собственный набор помощников по тестированию, так что вы можете просто включите его помощников непосредственно:
# spec/support/devise.rb RSpec.configure do |config| config.include Devise::TestHelpers, :type => :controller end