2012-02-09 9 views
3

ルビーでカードベースのゲームを開発したいと思います。TDDでやってみたいと思います。依存関係のある被験者をテストするには?

私が書きたい最初のクラスは、プレーヤーです。 各プレイヤーはのハンドと13枚のカードを持ち、そのターンに1枚のカードを選択してプレーできる。

私は(、カードのような、手...)他のクラスを開発していない、私は他のクラスに依存しているこのテーマをテストする方法を知りたいですか?

私はモックを知っているが、私はそれらを使用することができますかわかりません。

例えば、このシナリオでは、プレーヤーのカードをプレイしたときに、そのカードを自分の手札から取り除く必要があることを知っています。

これは私のコードです:

require "rspec" 
require "lib/player" 

describe Player do 
    before(:each) do 
    hand=mock("Hand") 
    hand.should_receive(:count).and_return(13) 
    subject.hand=hand 
    end 

    it "should choose and play a card from her/his hand" do 
     subject.hand.count.should==13 
     card_selected=subject.play(2)  # card #2 in his/her hand 
     subject.hand.count.should=12 
    end 
end 

はまた、実装では、我々は、私はそれを扱うことができるか、手のクラスに依存していますか?

+0

おそらくあなたは自分より先に進んでいます。まだ存在していないため、Handを模倣する必要はありません。これで、Handクラスを作成した後にテストを書き直すようになります。テストを変更する必要はありません。あなたがそれをテストするための基本的なHandクラスを持つまで、playメソッドをテストしないでください。 –

+3

私は同意しません。サポートするクラスを取得する前にテストを書くことは、基本的にあなたが望むAPIのテストを書いているので、はるかに意味のあるAPIを書くのに役立ちます。次に、そのAPIを実装して、テストをパスします。 –

+0

私はMarc Talbotが正しいと思っています。Mocksの使い方の1つは、依存関係の知識がない状態でテストすることです。 –

答えて

2

私はモックとスタブの私の分け前を見てきた、と私は巨大なテストスイートは、半分のコードももはや存在していなかったので、アプリは信じられないほど壊れていたにもかかわらず、合格見てきました。

私はスタブとモック細心の注意を払って使用すべきであるという結論に来ています。それは、可能な限り遅く導入されるべきであるという事実です。

これは、モックするのは時期尚早だ例です。あなたはまだクラスHandを持っていないので嘲笑しています。

サイドノートとして、テスト自体に改善が必要です。あなたはこの値にスタブ、もちろん

hand.should_receive(:count).and_return(13) 
subject.hand=hand 
subject.hand.count.should==13 
subject.hand.count.should=12 

subject.hand.count.should==13パス:これらの行を詳しく見てみましょう。もちろん、は、==に電話していないため、渡します。あなたが本当の期待に変えたら、それがなぜ失敗するのか疑問に思います。 Hand#countにスタブすると失敗します。は13に戻ります。

ここで実際に行っていることは、テスト対象のAPIの一部を模倣していることです。これをしないでください。代わりに、赤ちゃんのステップで始まる。これは意味することができます:

  • あなたは内部を開始し、あなたの方法をアウトします。この場合、最も内側のクラスHandから始めます。 Playerに達すると、すべての部分がうまく合わなくなります。

  • はあなたが絶対に他のクラス必要になるまでPlayerで始まる(やるが、もしあなたに「意味のあるAPI」アピールの引数)。これは、NameErrorHandになるのを待ちます。次に、必要に応じてHandクラスを実装します。そして、バックPlayerまた

に取得し、あなたのコードを見ては、問題を提起:ちょうど好奇心から、なぜあなたは最初の場所でのプレーヤーと彼女の手を分離するのでしょうか?

関連する問題