21296


Ruby on Railsで開発をしています。  
現在、scaffoldで簡単な管理画面を作成しています。  
中身はほぼ終わり、管理画面全体にbasic認証をかけましたが、その後、scaffoldで自動的に生成されてたspecファイルの内容がパスできなくなりました。  
Basic認証時にテストをパスさせるために必要なことは何か、コードでわかりやすく教えていただきたいです。  
あと、specファイルを書くのが難しいですので、参考できるサイトなどもお勧めしていただければと思います。

以下は現在自分のspecファイルです。

spec/requests/admin_companies_spec.rb

[code]

    require 'rails_helper'
    
    RSpec.describe 'Admin::Companies', type: :request do
      describe 'GET /admin_companies' do
        it 'works! (now write some real specs)' do
          get companies_path
          expect(response).to have_http_status(200)
        end
      end
    end
    
[/code]

必要なファイルとファイルの中身を詳細にお願いします。


CC BY-SA 3.0
2016-01-25T09:17:36.673
21293
2016-01-26T00:57:45.063
2016-01-26T00:57:45.063
10710
10710
question
ruby-on-rails rspec
Basic認証時、specファイルを作成してください。


どのようなコードになっているのかわからないので、的確なアドバイスは出来かねますが、テストのみbasic認証をパスさせるのであれば、環境を見てbasic認証する・しないを判定してはどうでしょうか。特にご自身で修正を加えていなければ、テスト(rake
spec)は`RAILS_ENV=test`で動作しているかと思いますので、認証部分は以下のようになるかと思います。

[code]

    def basic_authenticate
      return true Rails.env.test? # testの場合は一律trueを返す
    
      # test以外の場合はbasic認証を実施する
      authenticate_or_request_with_http_basic do |user, pass|
        user == 'hoge' && pass == 'foo'
      end
    end
    
[/code]

また、basic認証部分のメソッドを`before_action`で一元的に実行しているのでしたら、以下のような制御も可能かと思います。

[code]

    # test時はbasic_authenticateメソッドを実行しない
    before_action :basic_authenticate, if: !Rails.env.test?
    
[/code]

RSpecの参考資料ですが、 **Everyday Rails - RSpecによるRailsテスト入門
(<https://leanpub.com/everydayrailsrspec-jp>)**
という書籍が大変良書ですので、ぜひご一読することをお勧めします。(リファレンスとしても利用できるかと思います)


CC BY-SA 3.0
2016-01-25T10:15:10.067
21296
2016-01-25T10:37:28.070
2016-01-25T10:37:28.070
13874
13874
21293
answer


英語版に[同じ質問があり回答がついてます](https://stackoverflow.com/questions/3768718/rails-rspec-
make-tests-pass-with-http-basic-authentication/5239091#5239091)

BASIC認証は`HTTP_AUTHORIZATION`ヘッダにBASE64でエンコードした`ユーザー名:パスワードを載せてリクエストを投げるもので、Railsアプリは環境変数からヘッダを読み込みますので、テストでBASIC認証を模倣するには環境変数に然るべき値を設定すればよい、ということです。

[code]

    request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(user,pw)
    
[/code]


CC BY-SA 3.0
2016-01-25T14:09:29.210
21303
2016-01-25T14:09:29.210
2017-05-23T12:38:55.250
-1
5793
21293
answer