14

capybara-webkitを使用して、サードパーティのWebサイトとの統合をテストしています(javascriptが必要です)。

統合テスト中に行われたリクエストを記録するためにvcrを使用したいのですが、capybara-webkitはネットhttpを経由しないため、vcrはそれらを記録できません。要求を記録できるようにするvcr用のアダプターを作成するにはどうすればよいですか?

4

2 に答える 2

15

残念ながら、VCR は capybara-webkit とはほとんど互換性がありません。実際のところ、カピバラ webkit は c にある webkit を使用しています。VCR のベースとなる Webmock と Fakeweb は、Ruby の Web リクエストにのみ使用できます。この 2 つを連携させることは、おそらく途方もない作業になるでしょう。

この問題を 2 つの方法で解決しました。

1 つ目 (ハックですが有効) は、テスト環境にのみ含まれるアプリケーションに新しい JavaScript ファイルを追加することです。このファイルは、外部 Web 要求を行う JS クラスをスタブ化します。このアプローチの純粋なハッカチュードとは別に、新しいリクエストが追加または変更されるたびに、スタブも変更する必要があります。

2 番目のアプローチは、すべての外部要求を自分のサーバーを介してルーティングし、サーバーを介してすべての外部要求を効果的にプロキシすることです。これには、消費したいすべてのものに対してアクションを持たなければならないという大きな欠点があります (いくつかの作業で一般化できます)。また、リクエストが完了するまでの時間が 2 倍になる可能性があるという事実にも悩まされています。ただし、現在は Ruby によって要求が行われているため、VCR を最大限に使用できます。

私の状況では、javascript をソースにとらわれないようにするには、データを操作するために ruby​​ が必要であるという事実のおかげで、アプローチ #2 の方がはるかに有利です。しかし、私はかなり長い間、アプローチ#1をうまく使用していました.

于 2012-06-26T19:57:15.333 に答える
10

rspec+capybara 用の小さな ruby​​ ライブラリ ( puffing-billy ) を作成しました。これはまさにこれを行います。これは、ブラウザと外の世界の間にプロキシを挿入し、特定のリクエストへの応答を偽造できるようにします。

例:

describe 'fetching badges from stackoverflow API' do
  it 'should show a nice message when you have no badges' do
    # stub some JSONP
    proxy.stub('http://api.stackoverflow.com/1.1/users/1/badges',
               :jsonp => { :badges => [] })

    visit '/my_badges'
    page.should have_content("You don't have any badges :(")
  end
end
于 2012-10-15T14:31:08.647 に答える