railstutorial.org チュートリアルの前半に基づいた、かなり単純な Rails アプリがあります。ここで頭を悩ませていることがあります... カピバラは、私が訪問するように言っているページを訪問していないようです. products#index
アクションを見る前に、ユーザーがログインしていることを確認したい。「ログインしていない」テストは正常にパスしていますが、「ログインしている」テストはパスする必要があるときに失敗し続けます。
これが私の製品ページの仕様です:
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
最初のテストはパスしますが、2 番目のテストはパスしません。いくつかの試行錯誤を使用して、それがホームページに行くことを理解することができました(ホームページのタイトルを入れればshould have_title()
合格です)
私は RSpec にかなり慣れていませんが、ほとんど同じである user_pages_spec テストは問題なく動作しています:
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
1 つが失敗し、1 つが合格する原因は何でしょうか? 何が起こっているかについて、rspec にさらに情報を吐き出させる方法はありますか?
それが役立つ場合、これが私のgemfileです:
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
どんな助けでも大歓迎です!私がこのように見つけた唯一の質問は、カピバラの訪問方法が機能していないことで、まったく役に立ちませんでした。
ありがとう!
アップデート
製品コントローラー:
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_action
言及されている s は、次のファイルsessions_helper
にあります。
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
....そして、これをすべて投稿した後、私はそれを理解しました...下に答えを貼り付けます。「フィルター」について言及してくれたピーター・ゴールドスタインに大きな敬意を表します...