2009-09-14 10 views

答えて

80

あなたは並べ替える必要があります。あなたは知る必要がある2つの基本的なことがあります:命名法とベストプラクティス。

まず、私はあなたの偉大なテスター、ロイOsheroveからの素晴らしいビデオリソースを与えたい:

ユニットテストは、彼は彼が完了 を持っていると言って出発するロイOsheroveによって

レビューテストハーネスのいくつかのレビュー は、いくつかのオープンソース プロジェクトに同梱されています。あなたはここにそれらを見つけることができます。 http://weblogs.asp.net/rosherove/archive/tags/TestReview/default.aspx

これらは基本的に、彼はこれらのテスト ハーネスを、順を追って説明して 、何悪いです良いものを示していますビデオレビュー です。非常に役立ちます。

ロイにも私が理解している本があります。 はとても良いです。

命名

このポッドキャストは非常 を手助けします:http://www.hanselminutes.com/default.aspx?showID=187

私は(Hanselminutesイントロ音楽が 恐ろしいであること) ものの、ポッドキャストを言い換えます:

基本的にeveryt隔離フレームワーク(Moq、Rhino Mocks、Mockなど)は、 fakeと呼ばれます。

あなたが をテストしているコードは製品コードの代わりに呼び出すことができることを テスト中に使用されているオブジェクトです。 がアプリケーションの の他の部分からテストしようとしているコードを分離するために偽物が使用されています。

があります(主に)偽物の2種類:スタブを皮肉っ。

モック

あなたが をテストしているコードは、それを呼び出すことができますし、 コールが正しい パラメータで行われたと主張するように、あなたは 場所に置くことに偽物です。

[TestMethod] 
public void CalculateTax_ValidTaxRate_DALCallIsCorrect() 
{ 
    //Arrange 
    Mock<ITaxRateDataAccess> taxDALMock = new Mock<ITaxRateDataAccess>(); 
    taxDALMock.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001")) 
        .Returns(0.08).Verifiable(); 

    TaxCalculator calc = new TaxCalculator(taxDALMock.Object); 

    //Act 
    decimal result = calc.CalculateTax("75001", 100.00); 

    //Assert 
    taxDALMock.VerifyAll(); 
} 

あなたがテストしていることを確認コードを作るために場所 にそれを置くことを除いてスタブは、 モックとほぼ同じである:以下のサンプルは、ちょうど この部品番号のアイソレーションを使用して フレームワークを行います は、 コールから一貫性のあるデータを取得します(たとえば、コードが データアクセスレイヤーを呼び出す場合、スタブは になります)。ただし、 はスタブ自体に対してアサートしません。その は、 メソッドが偽のデータアクセスと呼ばれる レイヤーであることを確認する必要はありません。 をテストしようとしています。スタブ を提供して、 テストを単独で実行しようとしているメソッドを取得します。私たちは、むしろ方法は 別のリソースへの呼び出しをしたこと 事実よりも、法の 出力をテストしていることをここ

[TestMethod] 
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect() 
{  
    //Arrange 
    Mock<ITaxRateDataAccess> taxDALStub = new Mock<ITaxRateDataAccess>(); 
    taxDALStub.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001")) 
        .Returns(0.08); 

    TaxCalculator calc = new TaxCalculator(taxDALStub.Object); 

    //Act 
    decimal result = calc.CalculateTax("75001", 100.00); 

    //Assert 
    Assert.AreEqual(result, 8.00); 
} 

お知らせ:

はここでスタブとの例を示します。

部品番号が実際にモックとスタブ 間のAPI 区別をしませんが、ここでの使用が タイプを決定するのに重要である( Mock<T>として宣言されたの両方に注意してください)。

希望すると、まっすぐに設定できます。

+8

Ayende(Rhino Mocksの作成者)は最近、Mock vs Stubを捨てて、次のバージョンのRhino Mockですべてを偽造すると発表しました。何人かは、モックの代わりに何かがスタブであることを知って知識を増やしていると主張する人もいます。気にしない場合は、常にモックを使用して、その前提を主張しないでください。それは、あなたが使いたいものを見つけなければならないという頭痛を軽減します。 –

+0

非常に良い説明アンダーソン。私は偽物や偽造に精通していませんが、Mocking and Stubsに精通しています。偽の命名法はどこから来ますか? –

+1

@Anderson Imes申し訳ありませんが、私はもっと明示的ではありませんでした。私はあなたの説明を理解し、それはかなり十分です。私が意味するのは、誰が "フェイク"の命名法を思いついたのかということです。私は前にこの文脈で言及されたことを見たことがないし、私が読んだことは常にMock対Stubsだった。私はAyendeのブログにも加入していますが、Mock/StubsとFakesを同じ文章で言及したことは一度もありません。 –

1

コードの塊をテストしたいと思います。あなたのメソッドは、http urlからファイルをダウンロードし、ディスクにファイルを保存した後、そのファイルがディスク上にあることをメールします。これらの3つのアクションはもちろん、あなたのメソッドが呼び出すサービスクラスです。なぜなら、それらは擬似的に簡単だからです。これらをモックしないと、テストを実行するたびに、テストが内容をダウンロードし、ディスクにアクセスし、メッセージを送信します。次に、メソッドのコードをテストするだけでなく、ダウンロードしてディスクに書き込んでメールを送信するコードもテストしています。これらを嘲笑しているなら、メソッドコードだけをテストしています。また、メソッドのコードが正しく動作していることを確認するために、ダウンロードの失敗をシミュレートすることもできます。

私は通常、値を保持しているロジックをあまり持っていないクラスをフェイクします。いくつかの値を保持しているオブジェクトを送信している場合、そのメソッドで変更されている場合は、テストでそれを読み取ってメソッドが正しいことを確認できます。

もちろん、ルールは少しでもうまくいくかもしれませんが、一般的な考え方はコードとコードのみをテストすることです。

1

The Little Mockerで非常に良い読書です。

[...]まもなく、いくつかの非常に賢い人々が、モックオブジェクトという用語を導入し定義した論文を書いた。他の多くの人がそれを読んで、その用語を使い始めました。紙を読んでいない他の人は、その言葉を聞いて、それをより広い意味で使用し始めました。彼らは言葉を動詞に変えた。彼らは、「その物体を嘲笑してみよう」とか、「私たちはやりたいことがたくさんある」と言うだろう。

この記事では、モック、フェイク、スパイ、スタブの違いについて説明します。

関連する問題