【问题标题】:Rails url helpers not working in RspecRails url 帮助程序在 Rspec 中不起作用
【发布时间】:2012-12-29 19:09:14
【问题描述】:

我是编程新手,这是我的第一个应用程序。 在 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

我尝试过使用无效的网址。 我尝试更新也不起作用的 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

【问题讨论】:

  • 知道为什么会这样吗?尽管使用 FactoryGirl 创建了用户?
  • 是的,一旦创建用户,它就会被登录。
  • 您发布的 RSpec 示例中未显示用户登录步骤。你需要像sign_in(user) 这样的东西。
  • 我已经在 support/utilities.rb 中有一个助手。编辑我的帖子以显示它。
  • 我发现了错误。在测试文件中我只添加了“user.save”并忘记输入“sign_in user”一旦我这样做了,所有的测试都通过了。

标签: ruby-on-rails ruby-on-rails-3 rspec capybara helpers


【解决方案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

根据您对用户进行身份验证的方式,您的情况会有所不同。例如,Devise 发布了自己的一组测试助手,因此您可以简单地直接包含它的助手:

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

【讨论】:

  • 正如我所说的视图的工作非常好。该应用程序完全按照预期的方式运行。我已经编辑了我的初始帖子以显示辅助方法。 Hartl 教程概述了我的身份验证是从头开始的。
  • 这些助手专门用于测试套件。如果应用程序正常工作并且测试失败,则表明您在测试期间没有“登录”。
【解决方案2】:

似乎因为用户不存在而出现错误。尝试将user.save 更改为user.save! 然后你会发现我认为的创建错误..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多