Omniauthのsetupをテストしたい
解決
def setup
omniauth_strategy.options[:consumer_key] = Global..twitter.consumer_key
omniauth_strategy.options[:consumer_secret] = Global..twitter.consumer_key_secret
render json: { message: "Omniauth setup phase." }, status: :not_found
end
RSpec.describe SessionController, type: :controller do
subject { get :setup, params: { provider: :twitter } }
let(:strategy_options) { Struct.new(:options).new({consumer_key: nil, consumer_secret: nil}) }
let(:consumer_key) { "twitter-mock-consumer_key" }
let(:consumer_secret) { "twitter-mock-consumer_key_secret" }
before do
allow(Global.twitter).to receive(:consumer_key).and_return(consumer_key)
allow(Global.twitter).to receive(:consumer_key_secret).and_return(consumer_secret)
allow(controller.request.env).to receive(:[]).and_call_original
allow(controller.request.env).to receive(:[]).with("omniauth.strategy").and_return(strategy_options)
end
context "Success" do
it "カスタムキーのセットアップを行う" do
subject
aggregate_failures do
expect(strategy_options.options[:consumer_key]).to eq consumer_key
expect(strategy_options.options[:consumer_secret]).to eq consumer_secret
expect(response).to have_http_status(:not_found)
end
end
end
end
注意点
paramsの設定
subject { get :setup, params: { provider: :twitter } }
【Rspec】ネストされているコントローラーのテストについて。「No route matches」と言わせない書き方 - 文系人間がエンジニアを目指すブログ
元の値を引用
allow(controller.request.env).to receive(:[]).and_call_original
[Rspec Make a mock against hash - Qiita](https://qiita.com/YumaInaura/items/e22552edc476167b9213#example-1)