1

Harlt の第 9 章の演習 9 と取り組んでいます。

チュートリアルの他のセクションと同様に、:no_capybara を true に設定してこの演習用のテストを設計すると、テストは成功しますが、次の警告が表示されます。

WARNING: ignoring the provided expectation message argument (true) since it is not a string.

このバージョンのテストは次のとおりです。

*spec/requests/authentication_pages_spec.rb*

describe "as an admin user" do 
   let(:admin) {FactoryGirl.create(:admin)}
   before do  
     sign_in(admin, :no_capybara => true)
   end

   describe "should not be able to delete itself by direclty submitting request" do 
     before { delete user_path(admin) }
     specify { response.should redirect_to(users_path), 
                flash[:error].should =~ /Can't delete own admin account/i }
   end
 end

これは、次のように、Hartl がチュートリアルの他のスペースでそのメソッドを使用する方法であることに注意してください。

*spec/requests/authentication_pages_spec.rb*

describe 'signed in user' do 
      let(:user) { FactoryGirl.create(:user) }
      before { sign_in user, no_capybara: true }

      describe 'unable to access now' do  
        before {get new_user_path}
        specify { expect(response).to redirect_to(root_url)}
      end
.
.
.ect...

ただし、:no_capybara を設定しないと、テストが失敗します。

describe "as an admin user" do 
  let(:admin) {FactoryGirl.create(:admin)}
  before { sign_in(admin) } 
  .
  .
  .
Failures: 

  1) Authentication authorization as a non-admin user submitting a DELETE request to the     Users#destroy action 
     Failure/Error: before { delete user_path(user)}
     NoMethodError:
       undefined method `admin?' for nil:NilClass
     # ./app/controllers/users_controller.rb:68:in `admin_user'
     # ./spec/requests/authentication_pages_spec.rb:74:in `block (5 levels) in <top (required)>'

私の2つの主な質問は次のとおりです。

  1. そのテスト中にその警告が発生するのに、:no_capybara を sign_in メソッドに渡す他のテストでは発生しないのはなぜですか?
  2. no_capybara を渡さないとテストが失敗するのはなぜですか? この演習に関連するスタックオーバーフローに関する他の質問を見てきましたが、他の人の解決策では no_capybara は必要ありません。

以下は、該当する可能性のある私のアプリ内のすべてのコードです。もっと含める必要がある場合は、お知らせください。

*users_controller.rb*

before_action :admin_user,        only: :destroy 

def destroy
  user = User.find(params[:id])
  if !current_user?(user)
    user.destroy
    flash[:success] = "User destroyed.  ID: #{user.id}"
  else
    flash[:error] = "Can't delete own admin account"
  end
  redirect_to users_path
end

def admin_user
  redirect_to(root_url) unless current_user.admin?
end

*コントローラー/ヘルパー/session_helper.rb*

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

1 に答える 1

0

2番目のケースでは、レールが管理者を見つけることができなかったと思いますか? 存在しないため、メソッド。そのため、このエラーが発生しています

NoMethodError:
undefined method `admin?' for nil:NilClass

これらのコードを実行しましたか

$ rails generate migration add_admin_to_users admin:boolean 
$ bundle exec rake db:migrate
$ bundle exec rake test:prepare

エラーによると、レールは管理者のブール値をチェックするだけでなく、メソッドを探していると思います。

于 2013-10-12T18:19:41.123 に答える