1

始める前に、テストを容易にするためにrspec、shoulda-matchers、およびfactorygirlでレールを使用しているので、これらのライブラリに以下の問題を解決するのに役立つものが含まれている場合はお知らせください.

私はコントローラーとモデルを設計していましたが、この状況をテストする方法がわかりませんでした。

たくさんのプレーヤーを含めることができるゲームモデルがあります。ゲームがまだ開始されていない場合にのみプレーヤーを削除できるため、ゲーム モデルに remove_player メソッドを追加して徹底的にテストしました。

私のプレーヤー コントローラーでは、remove_player メソッドを呼び出して実際に作業を行う削除アクションがあり、そのアクションによってリダイレクトが発生します。

メソッドを再テストせずに、コントローラーが実際に想定されていることを実行していることをテストするにはどうすればよいですか (remove_player を呼び出します)。リダイレクトをテストできますが、将来、remove_player の呼び出しが削除されても失敗しません。

shoulda-matchers には「should_validate_presence_of」などがあることは知っていますが、これはこのテストの背後にある考え方と同じですが、私自身の方法では機能しません。

4

1 に答える 1

1

昨夜、モックとスタブを試してみましたが、まさに私が望んでいたことを実行してくれました。RSpec のモックは簡単に手に入れることができ、rspec gem に含まれています。

スタブの基本的な考え方は、別のオブジェクトをテストするために使用している実際のオブジェクトを置き換えることです。私の質問の例では、プレーヤー コントローラーをテストするときにゲーム モデルのスタブを作成し、gamestub.remove_player が常に true を返すとします。RSpecでは、次のようにすることができます

@game = double("game") #a double is rspec's mock/stub object
@game.stub(:remove_player?).and_return(true)

モックは、モックしているオブジェクトを単に置き換えるだけでなく、テスト条件の一部でもあるという点で少し異なります。偽のオブジェクトが呼び出された場合に何を返すかだけでなく、それを n 回呼び出す必要がある (またはテストが失敗する) こと、および呼び出されると予想されるパラメーターを指定できます。上記の例では、ゲームをモックして、gamemock.remove_player を 1 回呼び出し、現在のプレーヤーに渡して true (または、テストが失敗した場合に何が起こるかをテストしたい場合は false) を返す必要があると言うことができます。これは、私がプレイヤー コントローラーに対して行ったような例です。

@game = double("game")
Game.should_receive(:find_by_id).with("123").and_return { @game }
@game.should_receive(:remove_player?).with(current_user).and_return(true)
delete :destroy, {:id => 123}
response.should do_whatever

モックとスタブはよく似ています。この記事では、違いを強調しようとします。モックはスタブのすべての機能を備えており、1 つとして使用できるため、基本的にはそれらをどのように使用するかのように思えます。それがおそらく、RSpec がそれらを 1 つの型 (double) として扱う理由です。

于 2013-04-25T20:08:48.360 に答える