0

私はmhartls のrails チュートリアルを rails 4.x で数回実行しましたが、楽しみのためにもう一度始めましたが、rails 5.0.0.beta1 に更新しました。第 9 章までのすべての非互換性に対する解決策を見つけることができました。具体的には、users コントローラーでの destroy アクションのテストが機能しません。私は得る:

ERROR["test_should_redirect_destroy_when_not_logged_in", UsersControllerTest, 1.489256506320089]
 test_should_redirect_destroy_when_not_logged_in#UsersControllerTest (1.49s)
URI::InvalidURIError:         URI::InvalidURIError: bad URI(is not URI?): http://www.example.com:80destroy
            test/controllers/users_controller_test.rb:49:in `block (2 levels) in <class:UsersControllerTest>'
            test/controllers/users_controller_test.rb:48:in `block in <class:UsersControllerTest>'

URI::InvalidURIError: bad URI(is not URI?): http://www.example.com:80destroy
    test/controllers/users_controller_test.rb:49:in `block (2 levels) in <class:UsersControllerTest>'
    test/controllers/users_controller_test.rb:48:in `block in <class:UsersControllerTest>'

bin/rails test test/controllers/users_controller_test.rb:47

私のコントローラーの破棄アクション:

def destroy
  User.find(params[:id]).destroy
  flash[:success] = "User deleted"
  redirect_to users_url
end

私のテスト:

test "should redirect destroy when logged in as a non-admin" do
  log_in_as(@other_user, integration_test: 'true')
  assert_no_difference 'User.count' do
    delete :destroy, params: { id: @user }
  end
  assert_redirected_to root_url
end

リンクは実際に機能しますが、テストは失敗します。次のようなルートを追加することでテストに合格することができます: delete 'delete_user' => 'users#destroy'AND テストを次のように変更します:delete delete_user_path params:{id: @user}ただし、実際のサイトとテストは異なるルートを使用しているため、これを信頼できるかどうかはわかりません。ユーザーから破棄を削除するとresources: resources :users, except: :destroy、ページ リンクは機能しませんが、テストは引き続きパスします。ページリンクで delete_user ルートを使用する方法がわかりません。また、テストで user#destroy ルートを機能させることができないようです。これが統合テストではないことは認識していますが、この回避策により他のいくつかの問題が修正されました。後でリファクタリングして、意味をなすようにします。

追加の関連するコントローラー コード:

before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :correct_user,   only: [:edit, :update]
before_action :admin_user,     only: :destroy

private

  def user_params
    params.require(:user).permit(:name, :email, :password,
                                 :password_confirmation)
  end

  # Before filters

  # Confirms a logged-in user.
  def logged_in_user
    unless logged_in?
      store_location
      flash[:danger] = "Please log in."
      redirect_to login_url
    end
  end

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

  # Confirms an admin user.
  def admin_user
    redirect_to(root_url) unless current_user.admin?
  end

Test Helper Code:

    # Logs in a test user. (I think all tests must be like integration)
def log_in_as(user, options = {})
  password    = options[:password]    || 'password'
  remember_me = options[:remember_me] || '1'
 # the next line is the work around for rails version >=5.1
  integration_test = options[:integration_test] || 'false'
  if integration_test == 'true'
    post login_path, params: { session: {  email: user.email,
                                password: password,
                                remember_me: remember_me }
                              }
  else
#      params[:session][:user_id] = user.id
#      session[:user_id] = user.id 
   controller.session[:user_id] = user.id
   # params[session[:user_id] ] = user.id 
  end
end

Gemfile:

source 'https://rubygems.org'

ruby '2.3.0'
gem 'rails',                     '>= 5.0.0.beta1'
gem 'railties',                  '>= 5.0.0.beta1'
gem 'bcrypt',                    '>= 3.1.10'
gem 'faker',                     '>= 1.6.1'
gem 'carrierwave',               '>= 0.10.0'
gem 'mini_magick',               '>= 4.3.6'
gem 'fog',                       '>= 2.0.0.pre.0'
gem 'kaminari', :git => "git://github.com/amatsuda/kaminari.git", :branch => 'master'
gem 'kaminari-bootstrap',        '>= 3.0.1'
gem 'bootstrap-sass',            '>= 3.3.6'
gem 'sass-rails',                '>= 5.0.4'
gem 'uglifier',                  '>= 2.7.2'
gem 'coffee-rails',              '>= 4.1.1'
gem 'jquery-rails',              '>= 4.0.5'
gem 'therubyracer',              '>= 0.12.2'
gem 'turbolinks', github: 'rails/turbolinks'
gem 'jbuilder',                  '>= 2.4'
gem 'sdoc',                      '>= 0.4.1', group: :doc
gem 'net-ssh'

group :development, :test do
  gem 'sqlite3',                  '>= 1.3.11'
  gem 'byebug',                   '>= 8.2.1'
  gem 'spring',                   '>= 1.6.1'
end

group :development do
  gem 'web-console',              '>= 3.0.0'
end

group :test do
  gem 'minitest-reporters',       '>= 1.1.7'
  gem 'mini_backtrace',           '>= 0.1.3'
  gem 'guard',                    '>= 2.13.0'
  gem 'guard-minitest',           '>= 2.4.4'
  gem 'minitest',                 '>= 5.8.3'
  gem 'rails-controller-testing', '>= 0.0.3'
end

group :production do
  gem 'pg',                       '>= 0.18.4'
  gem 'rails_12factor',           '>= 0.0.3'
  gem 'puma',                     '>= 2.15.3'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', '>= 1.2015.7', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
4

2 に答える 2