Deviceを使用したアプリで、Rspecを用いてテストする場合

投稿者: Anonymous

初めて、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'

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

どうすれば解決できるでしょうか。

解決

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

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *