首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RSpec / Capybara非Rails4应用程序中的“访问”

RSpec / Capybara非Rails4应用程序中的“访问”
EN

Stack Overflow用户
提问于 2013-11-06 21:42:28
回答 1查看 381关注 0票数 0

我有一个相当简单的rails应用程序,基于railstutorial.org教程的前半部分。我有点头皮抓伤.水豚似乎没有访问我说要访问的那一页。我想确保用户在看到products#index操作之前已经登录了。我有‘未登录’测试通过罚款,但‘登录’测试总是失败时,它应该通过。

这是我的产品页面规范:

代码语言:javascript
运行
复制
require 'spec_helper'

describe "Product pages" do

  subject { page }

  describe "index" do

    context "when not signed in" do
      before { visit products_path }

      it { should have_title 'Sign in' }
    end

    context "when signed in" do

      let(:user) { FactoryGirl.create(:user) }

      before do
        sign_in user
        visit products_path
      end

      it { should have_title('Listing all products') }

    end
  end 
end

第一个测试通过了,但第二个测试没有通过。通过一些尝试和错误,我能够知道它将进入主页(如果我将主页的标题放在它通过的should have_title()中)

我对RSpec非常陌生,但是几乎相同的user_pages_spec测试正在运行a-ok:

代码语言:javascript
运行
复制
require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "index" do

    let(:user) { FactoryGirl.create(:user) }

    before do
      sign_in user
      visit users_path
    end

    it { should have_title('All users') }
    it { should have_content('All users') }
  end
end

是什么导致一个人失败,一个人通过呢?有没有办法让rspec提供更多关于正在发生的事情的信息?

这是我的宝石文件,如果这有帮助的话:

代码语言:javascript
运行
复制
source 'https://rubygems.org'
ruby '2.0.0'
#ruby-gemset=micmanager

gem 'rails', '4.0.1'
gem 'pg', '0.15.1'
gem 'bootstrap-sass-rails'
gem 'bcrypt-ruby', '3.1.2'
gem 'faker', '1.1.2'
gem 'will_paginate', '3.0.4'
gem 'bootstrap-will_paginate', '0.0.9' 

group :development, :test do
  gem 'rspec-rails', '2.13.1'
  gem 'guard-rspec', '2.5.0'
  gem 'spork-rails', github: 'sporkrb/spork-rails'
  gem 'guard-spork', '1.5.0'
  gem 'childprocess', '0.3.6'
  gem 'guard-livereload', require: false
  gem 'rack-livereload'
  gem 'rb-fsevent', require: false
  gem 'factory_girl_rails', '4.2.1'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
  gem 'growl', '1.0.3'
end

gem 'sass-rails', '4.0.0'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.0'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

任何帮助都是非常感谢的!我发现的唯一这样的问题是:Capybara visit method is not working,它根本没有任何帮助。

谢谢!

更新

产品财务主任:

代码语言:javascript
运行
复制
class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]
  before_action :signed_in_user
  before_action :admin_user, only: [:index, :new, :edit, :update, :destroy]
  # GET /products
  # GET /products.json
  def index
    @products = Product.all
  end
end

提到的before_actions位于sessions_helper文件中:

代码语言:javascript
运行
复制
    module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  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

  def current_user
    remember_token = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)    
  end

  def store_location
    session[:return_to] = request.url if request.get?
  end

  def signed_in_user
    unless signed_in?
      store_location
      redirect_to signin_url, notice: "Please sign in."
    end
  end

  def correct_user
    @user = User.find(params[:id])
    redirect_to root_url unless current_user?(@user)
  end

  def admin_user
    redirect_to root_url unless current_user.admin?
  end
end

....and发布了所有这些后,我想出来了.我把答案贴在下面。感谢彼得·戈德斯坦提到“过滤器”,因为那就是问题所在.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-07 00:10:57

找到了解决办法:

before_action :admin_user, only: [:index, :new, :edit, :update, :destroy]应该是before_action :admin_user, only: [:new, :edit, :update, :destroy],因为我不想将索引操作限制为仅限于管理员,而是任何登录用户。(最初我确实想这么做,但后来改变了主意)

因此,它在:admin_user上失败了,并被重定向到主页,从而导致了我的错误。

我的错。

我们学到了什么?孩子们,检查你们的过滤器。总是检查你的过滤器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19823431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档