2011-09-07 8 views

答えて

16

ありませんよ。テスト中にテストで使用できないオブジェクトで作業する必要がある場合は、そのオブジェクトがどのように動作して動作するかを概算するためのモックを使用できます。スタブは、同様の方法で使用できますが、オブジェクトの個々のメソッドで使用できます。ここで

は、両方の多くを使用しての、むしろ不自然な例です:

class Client 
    def connect_to_server 
    if Server.connect.status == 'bad' 
     show_an_error 
    else 
     do_something_else 
    end 
    end 
    def do_something_else; end 
    def show_an_error; end 
end 

context "failure" do 
    it "displays an error" do 
    bad_network_response = double("A bad response from some service", :status => 'bad') 
    Server.should_receive(:connect).and_return(bad_network_response) 

    client = Client.new 
    client.should_receive(:show_an_error) 
    client.connect_to_server 
    end 
end 

あなたはモックやスタブの多くを使用することは悪い考えであることを想像することができます。これは基本的にテストでコードの一部を隠していますが、難しい/まれなテストシナリオでは簡単に解決できます。

工場ガールは、テスト用のデータを生成するのに便利です。あなたはモデルを作成するためのレシピとして工場を使用しますが、多くのテストデータを含むものをテストする必要があるかもしれませんが、これはフィクスチャを使用できず、複雑なオブジェクトを明示的に作成するのは面倒です。

+1

私は間違っている可能性がありますが、私はあなたがスタブに誤っていると思っています。スタブオブジェクトやモックオブジェクト、またはスタブされたメソッドやモックされたメソッドを持つことができます。違いは、それらをどのように使用しているかです。スタブは実際に別の依存関係を呼び出さずにテストを実行するだけです。モックは同じことをしますが、呼び出しが必要であり、テストの一部です。スタブとモックの両方を持つ擬似オブジェクトを持つことができます。 Rspecはモックの代わりに "ダブル"と呼んでいます。 – fregas

15

あなたの最初のピットストップは、Martin Fowler氏の有名な記事である:Mocks are not Stubs

編集

MocksStubsTest Doubles(Mezaros用語)のタイプの2つです。テストダブルは、通常、テスト中のシステム(またはテスト中のクラス)が必要とする依存関係をシミュレートするために使用されるため、SUT/CUTはその依存関係とは独立してテストされます。 (警告 - Jeff hereにより述べたように、正確な用語はかなり厄介な被写体、例えばすることができる)

ウィキペディア:

  • スタブメソッドはちょうど一定の値wを返すかもしれないSUTによって呼び出された鶏、例えば。 SUTの特定のテストケースを実施するためのものである。
  • *フレームワークMockito(Java)とMoq(.Net)のようなフレームワークを使用すると、依存関係のインターフェイスに対して、最低限のコードで即座にモッククラスを構築し、SUTがモックと正しく相互作用したかどうか、例えばSUTがモックのメソッドを正しい回数だけ正しいパラメータで呼び出したことを確認することによって、

*免責事項 - 私はあなたが偽のオブジェクトとしてモック(またはダブル)を考えることができルビーdevの

+6

これを読んだら、[TABの捏造](http://avdi.org/devblog/2011/09/06/making-a-mockery-of-tdd/)に移動することができます –

関連する問題