2013-01-15 30 views
3

我是編程新手,這是我的第一個應用程序。 在Rails中創建應用程序時,我有兩個模型。用戶&列表,嵌套。Rails url助手不能在Rspec中工作

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 

我試圖玩弄沒有工作的網址。 我試圖更新rspec/capybara也沒有工作。 我也檢查了包括

config.include Rails.application.routes.url_helpers 

在規範的幫手。

我如何讓幫手工作?或者我錯過了一些小細節? 在此先感謝。

輔助方法。

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的幫手登錄。 支持/ utilities.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 
+0

CURRENT_USER是零 – apneadiving

+0

任何想法,爲什麼是這樣的話?儘管使用FactoryGirl創建用戶? – ShivamD

+0

你是否登錄用戶? – apneadiving

回答

1

沒有看到堆棧跟蹤,我認爲你的問題是在這條線的觀點:

<%= 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 

你得到的將取決於你如何驗證你的用戶是不同的。例如,制定發佈了自己的一套測試幫手,所以你可以簡單地直接包括其助手:

# spec/support/devise.rb 
RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 
+0

正如我所說的視圖的工作非常好。該應用程序的功能完全符合預期的方式我編輯了我的初始文章以顯示幫助器方法。我的認證是由Hartl教程概述的。 – ShivamD

+1

這些助手專門用於測試套件。如果應用程序正常工作並且測試失敗,則表明在測試過程中您沒有「登錄」。 – Brandan

0

似乎因爲用戶不存在,它收到一個錯誤。嘗試改變user.saveuser.save!那麼你會趕上錯誤的創作我覺得..