0

コントローラにサードパーティのAPIに接続し、いくつかの作業を行うアクションがあります。コードが成功すると、ユーザーが保存されます。サードパーティのAPIが失敗した場合、ユーザーは保存されません。

def create
  if ThirdPartyApp.connect.eql? true
    User.create(params[:user])
  else
    redirect home_path
  end
end

User.createサードパーティのアプリコードを気にせずにコードをテストしたい。私はスタブとモックを認識しており、一方がインスタンスメソッドをテストし、もう一方がクラスメソッドをテストするという違いを理解しています。サードパーティのアプリが機能するために必要なテストでは特定の条件を満たせないため、rspecテストではこれを使用する方法がわかりません。スタブ、モック、またはその他の方法でこのテストを作成する方法についてのヘルプは素晴らしいでしょう。

4

1 に答える 1

3

ここにいくつかの解決策があります:

まず、VCRのようなツールを使用できます(Ryan Batesはこれに関する優れたスクリーンキャストを持っています!)このようにして、APIからの応答を記録して最初にテストを実行し、2回目以降は「再生」するだけです。それらの用語を使用するための「記録」。

API応答に大きく依存するリクエストでスタブ/モックを使用するのは難しい場合があります。それが私だった場合(そして私はあなたがこのコントローラーのアクションをどのようにテストしているかを推測しています)

it "creates user" do
  ThirdPartyApp.any_instance.stub(:connect) { true }
  # fill in form or submit params as required
  User.count.should == 1 # or some other assertion
end

次に、失敗をテストできます。

it "fails from the api" do
  ThirdPartyApp.any_instance.stub(:connect) { false }
  # fill in form or submit params as required
  current_path.should == '/whatever' # or some other assertion
end

他の人は別の解決策を主張するかもしれません、そして私がこの状況で選択をしたならば、私はVCRで行くでしょう。

于 2013-03-14T20:59:51.977 に答える