55346
初めて、Deviceを使用したアプリで、Rspecを用いてテストしようとしています。

はじめにコントローラーのテストファイルに、以下を追加して、正常なレスポンスが帰ってくるかのテストをしようとしています。

```

    it "returns a 200 response" do
    get :index
      expect(response).to have_http_status "200"
    end
    
```

その結果、以下のようなエラーが出ました。

```

    Devise::MissingWarden:
           Devise could not find the `Warden::Proxy` instance on your request environment.
           Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack.
           If you are seeing this on one of your tests, ensure that your tests are either executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you.
    
```

修正する方法を調べ、spec_helper.rbに以下のコードを追加しましました。

```

    config.include Devise::Test::ControllerHelpers, type: :controller
    
```

しかし、以下のエラーが発生しました。

```

    NameError:
      uninitialized constant Devise
    
```

再び調査し、application.rbに

```

    require 'devise'
    
```

を入れてみたのですが、エラーが変わらなく全てのページにおいてテストすることができません。

どうすれば解決できるでしょうか。
CC BY-SA 4.0
2019-05-29T09:04:35.237
55344
2019-05-29T09:48:51.387
2019-05-29T09:09:37.367
7676
32819
question
ruby-on-rails ruby rspec devise
Deviceを使用したアプリで、Rspecを用いてテストする場合
`require 'devise'`が抜けているのではないでしょうか？  
`rails_helper.rb`に以下のような記載をするをするのが一般的だと思います。

```

    require 'spec_helper'
    require 'rspec/rails'
    # note: require 'devise' after require 'rspec/rails'
    require 'devise'
    
    RSpec.configure do |config|
      # For Devise > 4.1.1
      config.include Devise::Test::ControllerHelpers, :type => :controller
      # Use the following instead if you are on Devise <= 4.1.1
      # config.include Devise::TestHelpers, :type => :controller
    end
    
```

公式ページ  
<https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-
Rails-%28and-RSpec%29#controller-specs>
CC BY-SA 4.0
2019-05-29T09:48:51.387
55346
2019-05-29T09:48:51.387
9608
55344
answer