2016-01-11 75 views
0

我已經通過mhartls's軌運行教程,軌道4.x和只是爲了好玩了幾次升級後,我又開始了,但更新到軌5.0.0.beta1。 我已經設法找到解決所有不兼容性的解決方案,直到第9章。具體來說,我無法在用戶控制器上運行destroy操作的測試。我得到:錯誤users_controller_test從軌道4,5

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'和更改測試:delete delete_user_path params:{id: @user}然而,實際的站點和測試使用的是不同的路線,所以我不知道如果我能相信這一點。如果我刪除用戶resources: resources :users, except: :destroy的銷燬,那麼頁面鏈接不起作用,但測試仍然通過。我看不到如何在頁面鏈接上使用delete_user路由,並且似乎無法讓用戶#銷燬路由在測試中工作。我知道這不是一個集成測試,但是這個解決方法解決了其他一些問題。我稍後會重構,這樣纔有意義。

其他相關的控制器代碼:

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] 

回答

1

正確的解決方法是,以取代:

delete :destroy, params: { id: @user } 

與:

delete user_url(@user) 
0

看來我的當前設置(見的Gemfile等),令牌(:破壞,:用戶等)都沒有辦理了如我在先前的設置(如mhartl建議),所以我用的解決方法是與命名路由,以取代所有在我的測試中的令牌(相同:用戶將成爲user_path(@user)的破壞作用似乎並不具備默認的命名路由,所以我添加了一個到routes.rb文件。

我可以得到測試,加入這樣的路線經過:

delete 'delete_user' => 'users#destroy' 

和更改測試:

delete delete_user_path params:{id: @user} 

然而,實際的站點和測試使用的是不同的路線以同樣的行動,所以我不知道我是否可以相信這是最終的解決方案。

如果我刪除從用戶資源的破壞:

resources :users, except: :destroy 

那麼頁面鏈接不工作,但測試仍然通過。我看不到如何在頁面鏈接上使用添加的'delete_user(@user)路線',當我嘗試時,我一直在找不到用戶,而且我似乎無法讓用戶#destroy操作在測試中工作增加的路線。