1

質問:Googleにログインしてデータベースと何らかの方法で(アプリまたはコードで)対話するRSpec / Capybaraテストを作成し、それらの対話の結果を正常に表示するには、何を設定する必要がありますか?アプリ?

具体的には、次のことを行う1つの仕様が必要です。

  1. Projectsデータベースにいくつか作成する
  2. プロジェクトインデックスに移動します(ログインのためにGoogleにリダイレクトされます)
  3. Googleからログインして、アプリへのアクセスを許可します
  4. ページにリストされている外観をアサートしProjectsます

そしてこのような別のもの:

  1. プロジェクトインデックスに移動します(ログインのためにGoogleにリダイレクトされます)
  2. Googleからログインして、アプリへのアクセスを許可します
  3. [プロジェクトの追加]をクリックします(フォームにリダイレクトされます)
  4. フォームに入力して[保存]をクリックします(これにより、インデックスにリダイレクトされます)
  5. 新しく作成さProjectれたものがページに表示されることをアサートします

これを行うために私が書いたテストは機能しません。

最初の試み(「標準」のRSpec / Capybara / Seleniumを使用)

js: true適切なdescribeブロックWebMockを設定し、各仕様の接続設定を切り替えます。両方のテストの最後のステップは失敗します。最初のものはプロジェクトを表示していません。puts Project.countページにいくつかのプロジェクトが表示されているというアサーションの直前にできます。ゼロ以外の数値が表示されますが、それでもページには何も表示されません。2番目のテストの最後のステップで、内部サーバーエラーが発生します。

これに基づいて、いくつかのデータベース関連の問題があったように見えました

2回目の試行(いくつかのデータベース構成の追加)

次のコードに加えて、構成DatabaseCleaner.strategy = :truncationブロックを挿入しました。spec_helperRSpec

config.around :each, js: true do |spec|
    config.use_transactional_fixtures = false
    DatabaseCleaner.start
    WebMock.allow_net_connect!

    spec.run

    config.use_transactional_fixtures = true
    DatabaseCleaner.clean
    WebMock.disable_net_connect! :allow => %r{/((__.+__)|(hub/session.*))$}
end

最初の試みと同じ結果。

3回目の試み(セレンの代わりにポルターガイストを使用)

インストールし、Gemfileにphantomjs追加して、バンドルしました。poltergeistspec_helper必要capybara/poltergeistと設定しCapybara.javascript_driver = :poltergeistました。そのボタンをクリックしても何も起こらないように見えたため(または、ドライバーがボタンをクリックしなかったため)、アクセスを許可する手順を実行できなくなったため、状況はさらに悪化したようです。

追加情報 テストを機能させるために最初にやらなければならなかったのは、Google APIには事前登録されたコールバックURLが必要なため、Capybaraサーバーのポートを修正することでした。これは、で設定することCapybara.server_port = <some_number>で簡単に実現できましたspec_helper.rb

私のコントローラーの仕様は問題なく合格し、実際にアプリを使用すると問題なく動作します。最初のテストのコード(のわずかに変更されたバージョン)は次のとおりです。

require 'spec_helper'

describe 'Projects', js: true do
    it 'shows a list of projects' do
        Project.create!(name: "foo")
        visit projects_path
        fill_in "Email", with: "validemail@gmail.com"
        fill_in "Password", with: "password"
        click_on "Sign in"
        sleep 1.5 and click_on "Allow access" if page.has_content? "Allow access"
        page.should have_content("foo")
     end
end
4

0 に答える 0