質問:Googleにログインしてデータベースと何らかの方法で(アプリまたはコードで)対話するRSpec / Capybaraテストを作成し、それらの対話の結果を正常に表示するには、何を設定する必要がありますか?アプリ?
具体的には、次のことを行う1つの仕様が必要です。
Projects
データベースにいくつか作成する- プロジェクトインデックスに移動します(ログインのためにGoogleにリダイレクトされます)
- Googleからログインして、アプリへのアクセスを許可します
- ページにリストされている外観をアサートし
Projects
ます
そしてこのような別のもの:
- プロジェクトインデックスに移動します(ログインのためにGoogleにリダイレクトされます)
- Googleからログインして、アプリへのアクセスを許可します
- [プロジェクトの追加]をクリックします(フォームにリダイレクトされます)
- フォームに入力して[保存]をクリックします(これにより、インデックスにリダイレクトされます)
- 新しく作成さ
Project
れたものがページに表示されることをアサートします
これを行うために私が書いたテストは機能しません。
最初の試み(「標準」のRSpec / Capybara / Seleniumを使用)
js: true
適切なdescribe
ブロックWebMock
を設定し、各仕様の接続設定を切り替えます。両方のテストの最後のステップは失敗します。最初のものはプロジェクトを表示していません。puts Project.count
ページにいくつかのプロジェクトが表示されているというアサーションの直前にできます。ゼロ以外の数値が表示されますが、それでもページには何も表示されません。2番目のテストの最後のステップで、内部サーバーエラーが発生します。
これに基づいて、いくつかのデータベース関連の問題があったように見えました
2回目の試行(いくつかのデータベース構成の追加)
次のコードに加えて、構成DatabaseCleaner.strategy = :truncation
ブロックを挿入しました。spec_helper
RSpec
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
追加して、バンドルしました。poltergeist
でspec_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