1

このクラスで 100% のテスト カバレッジを達成する最善の方法を見つけようとしています。完全な仕様の概要を説明しました。誰かが私を正しい方向に向けてくれることを願っています。私の仮定では、Oauth2 リクエストをスタブするとこれが行われますが、それを機能させることはできないようです。

Rails4を使用しています。

ここに画像の説明を入力

仕様

RSpec.describe 'AppOmniAuthentication', type: :concern do
  let(:klass) { User }
  let(:user) { create(:user) }
  let(:user_oauth_json_response) do
    unfiltered_oauth_packet = load_json_fixture('app_omni_authentication_spec')
    unfiltered_oauth_packet['provider'] = unfiltered_oauth_packet['provider'].to_sym
    unfiltered_oauth_packet['uid'] = unfiltered_oauth_packet['uid'].to_i
    unfiltered_oauth_packet
  end

  before do
    OmniAuth.config.test_mode = true
    OmniAuth.config.mock_auth[:app] = OmniAuth::AuthHash.new(
      user_oauth_json_response,
      credentials: { token: ENV['APP_CLIENT_ID'], secret: ENV['APP_CLIENT_SECRET'] }
    )
  end

  describe '#from_omniauth' do
    let(:app_oauth) { OmniAuth.config.mock_auth[:app] }

    it 'returns varying oauth related data for Bigcartel OAuth response' do
      data = klass.from_omniauth(app_oauth)
      expect(data[:provider]).to eq(user_oauth_json_response['provider'].to_s)
      expect(data[:uid]).to eq(user_oauth_json_response['uid'].to_s)
      expect(data[:email]).to eq(user_oauth_json_response['info']['email'])
      expect(data[:customer_ids]).to eq(user_oauth_json_response['extra']['raw_info']['customer_ids'])
    end
  end

  describe '#refresh_access_token!' do
    it 'false if OAuth2 Fails' do
      allow(user).to receive(:access_token) { true }
      allow(user).to receive(:refresh_access_token!) { false }
      allow(user).to receive(:result).and_raise(OAuth2::Error)
      expect(user.refresh_access_token!).to be_falsey
    end

    it 'false if refresh fails' do
      allow(user).to receive(:access_token) { true }
      allow(user).to receive(:refresh_access_token!) { false }
      expect(user.refresh_token!).to be_falsey
    end

    it 'true if new token' do
      allow(user).to receive(:access_token) { true }
      allow(user).to receive(:refresh_access_token!) { true }
      expect(user.refresh_token!).to be_truthy
    end

    it 'true when refreshed' do
      auth_token = OpenStruct.new(token: FFaker::Lorem.characters(50),
                                  refresh_token: FFaker::Lorem.characters(50),
                                  expires_at: 5.days.from_now)
      allow(user).to receive_message_chain('access_token.refresh!') { auth_token }
      expect(user.refresh_access_token!).to be_truthy
    end
  end

  describe '#refresh_token!' do
    it 'false if no access token' do
      allow(user).to receive(:access_token) { false }
      expect(user.refresh_token!).to be_falsey
    end

    it 'false if refresh fails' do
      allow(user).to receive(:access_token) { true }
      allow(user).to receive(:refresh_access_token!) { false }
      expect(user.refresh_token!).to be_falsey
    end

    it 'true if new token is saved' do
      allow(user).to receive(:access_token) { true }
      allow(user).to receive(:refresh_access_token!) { true }
      expect(user.refresh_token!).to be_truthy
    end
  end

  describe '#token expired?' do
    it 'true if valid' do
      expect(user.token_expired?).to be_falsey
    end

    it 'false if expired' do
      user.token_expires_at = 10.days.ago
      expect(user.token_expired?).to be_truthy
    end
  end
end

アップデート

現在の仕様を次のように変更しました。

it 'false if OAuth2 Fails' do
  allow(OAuth2::AccessToken).to receive(:access_token) { Class.new }
  allow(OAuth2::AccessToken).to receive_message_chain('access_token.refresh!') { raise OAuth2::Error.new('ERROR') }
  binding.pry
end

ただし、現在、次のエラーが発生しています。

WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. Unregistered request..
4

2 に答える 2

0

キーはここの2行目にあるようです:

def refresh_access_token!
  result = access_token.refresh!
  store_token(result)
  save
rescue OAuth2::Error
  false
end

他のすべてのテスト スタブaccess_token. 実際のメソッドを呼び出すテストがあれば、access_tokenclientstrategy、およびの欠落している行がカバーされsettingsます。

strategysettings、およびclientはすべてかなり退屈です。最初の 2 つは本質的に単なる定数です。またclient、初期化するだけでは何もしません。したがって、それらを呼び出すことは大したことではありません。残りはaccess_token. OAuth2::AccessTokenコードがGithubにある を初期化することがわかります。初期化子もかなり退屈です。後で使用するために入力を保存するだけです。

したがって、そのrefresh!メソッドをスタブ化します。1 回は有効に見えるリフレッシュ トークンを返し、もう 1 回はOAuth2::Error. そのために使用できますexpect_any_instance_of。それが不安になる場合は:new、それ自体をスタブして、独自の偽のオブジェクトを返すようにすることもできます。

o = expect(OAuth2::AccessToken).to receive(:new) { Object.new }
expect(o).to receive(:refresh!) { raise OAuth2::Error.new("something here") }

リクエスト オブジェクトをOAuth2::Error使用するため、を構築するのは少し面倒に思えるかもしれませんが、あまり複雑なものは見当たりません。

それはあなたに100%のカバレッジを与えるはずです!

于 2016-07-01T15:54:53.880 に答える