2009-07-02 7 views
1

質問の最新バージョンモッキングフレームワークを使用して変曲点の対話を記録する。 Moq

こんにちは。

私の会社には、.NET 3.5に移行するとすぐにテストを受けることができるいくつかのレガシーコードベースがあります。私はMockingフレームワークとしてMoqを選択しました(私は鮮明な構文にすぐに惚れました)。

将来的に多く見られると予想される1つの一般的なシナリオは、他のオブジェクトとやりとりするオブジェクトを参照する場所です。

私はマイケルフェザーズの作品を知っています。変曲点を特定して、まともなサイズのコンポーネントを分離するのが得意です。抽出と上書きは王様です。

しかし、私の人生をはるかに簡単にする機能があります。

Component1とComponent2との対話を想像してください。 Component2は、火災の中央またはsomesuchにいくつかの奇妙なシリアル回線インターフェイスですが、多くのバイト検査、キャスティングおよびポインタ操作があります。私はComponent2を理解したくありませんし、Component1で消費されてきたレガシーインターフェイスには手荷物がたくさんあります。私は通常のモックを作成していますが、私はのインスタンスでパージングしています

component1.FireCentral = new Mock<IComponent2> (component2); 

:私がやりたい何

は、コンポーネント1によって消費COMPONENT2のインターフェースを抽出し、このような何かを行うことです実際のComponent2をMockオブジェクトのコンストラクタ引数として返します。私はComponent2に依存してテストをしているように思えるかもしれませんが、私はこのコードを保存するつもりはありません。これは、「テスト対象の場所オブジェクト」の儀式の一部です。

今、私は実際のシステムを(物理的な火を中央に接続して)起動し、次に私のオブジェクトとやりとりします。

私が望むのは、モックを調べて、component1がcomponent2とどのようにやりとりしたかのログを見ることです(モック上の文字列のコレクションを検査するためにデバッガを使用します)。さらに、模擬テストでは、テストコードで使用するComponent2に依存しないモックでこの動作を作成する期待のリスト(C#で)を提供することができました。

要するに、 mockingフレームワークを使用してインタラクションを記録し、テストコードで再生できるようにします。

質問

のHiの旧バージョン。

レガシーコードと多くのユーティリティクラスで作業することで、さまざまなシナリオで特定のクラスが周囲からどのように影響を受けているのか疑問に思うことがあります。 私が今朝働いていた1つのケースでは、一定のサイズに達するとその内容をファイルにダンプするように、通常のMemoryStreamをサブクラス化する必要がありました。

// TODO: Remove 
private class MyLimitedMemoryStream : MemoryStream 
{ 
    public override void Write(byte[] buffer, int offset, int count) 
    { 
     if (GetBuffer().Length > 10000000) 
     { 
      System.IO.FileStream file = new FileStream("c:\\foobar.html",FileMode.Create); 
      var internalbuffer = GetBuffer(); 
      file.Write(internalbuffer,0,internalbuffer.Length); 
     } 
     base.Write(buffer, offset, count); 
    }   
} 

(そして、ファイルを書き込んだ後にプログラムを終了するためにここでブレークポイントを使用しました)。 これはうまくいきましたが、どのWebフォーム(Webパーツ→Webパーツ→Webパーツ)コントロールが正しく表示されないかを確認しました。しかし、memorystreamにはたくさんの書き込みと書き込みがあります。

模擬フレームワークを使用して、特定のインスタンスがどのように動作しているかの概要をすばやく確認できますか?どんな巧妙なトリックですか? Rhino Mocksを使用しています。

これは、従来のコードを操作する上で大きな資産といえます。特に、シナリオで記録されたアクションが、単体テストで複製された同じシナリオに対する新しい期待/受諾基準として容易に設定できる場合。

すべての入力が高く評価されます。読んでくれてありがとう。

+0

あなたは2009年以来、このための何かを見つけますか?私はJVMのためにこれをしたい。 –

+0

いいえ。依存関係の動作をラップして記録する、モッキングフレームワークのタイプは、まだ私を逃しています。しかし、別の深刻な見通しの周りの時間かもしれません。 – Tormod

+0

ここでは、Javaと同じ質問があります。 http://stackoverflow.com/questions/16400897/record-method-calls-in-one-session-for-replaying-in-future-test-sessions 答えの1つは要点の実装を示しています。 https://gist.github.com/dfreeman/5563829 –

答えて

0

mockingフレームワークを使用して、特定のインスタンスがどのように動作しているかの概要を簡単に把握できるとは思いません。

ただし、このように動作していることを確認するためには、模擬フレームワークを使用して、その動作方法を定義できます。従来のコードでは、コードをテスト可能にする必要があります。

コードを大幅に再構築することなくレガシーコードで使用できる1つのテクニックは、のログシームを使用しています。この詳細については、InfoQのUsing Logging Seams for Legacy Code Unit Testingの記事を参照してください。

レガシーコードのテスト方法に関するヒントが必要な場合は、Michael Feathersの書籍Working Effectively with Legacy Codeをお勧めします。

希望すると便利です。

0

はい、可能です。厳密なモックを使用してモックを実行する単体テストを実行すると、テストは失敗し、予期しないメソッドが呼び出されたことが示されます。

これはあなたが探しているものですか?

+0

正確ではありません。仮面ライダーに、それに対して行われたすべてのやりとりを示すログがあれば、それは私が探していたものです。 さらに、モックが実際のオブジェクトを包み込み、その後オブジェクトに対して何が行われたか、そしてオブジェクトがどのように応答したかを調べることができれば、それは私が探していたものになります。 – Tormod

+0

私はRhinoMockやMoqがこのようなものを持っているとは思わない。あなたは簡単に最も強力なモックフレームワークであるTypeMockを調べるかもしれません。 –

0

モックフレームワークはこの問題のために設計されていません。 MoqやRhinoMockのどちらを使ってこの作業をすることができないのか分かりません。強力なTypeMockでさえあなたが求めていることをすることができないかもしれません。モックフレームワークはこのために構築されていません。

代わりに、アスペクト指向プログラミング(AOP)ツールを使用して、メソッド呼び出し前と呼び出し後の呼び出しを組み立てます。これはあなたが望むものを正確に行います:特定のタイプのすべての相互作用を見る。部品2

に呼ばれているすべてのメソッドがログに記録されます

public class Component2TracerAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
    if (eventArgs.Method == somethingOnComponent2) // Pseudo-code 
    { 
     Trace.TraceInformation("Entering {0}.", eventArgs.Method); 
    } 
    } 

    public override void OnExit(MethodExecutionEventArgs eventArgs) 
    { 
     if (eventArgs.Method == somethingOnComponent2) // Pseudo-code 
     { 
     Trace.TraceInformation("Leaving {0}.", eventArgs.Method); 
     } 
    } 
} 

:たとえば、PostSharp AOPフレームワークの中で、あなたは、単にいくつかの他のオブジェクトに対するメソッド呼び出しの前と後に呼ばれるあなたが好きな方法を指定します

2

この要件を理解している「ビジョン」の小さなクラブにようこそ。

残念ながら、私はこれはまだ.NETには存在しないと言います。私はそれがJavaにとっても存在しないと確信しています...私は数年間定期的に検索していましたが、現金支給のウェブサイトでこれについての現金報奨金を提供しましたが、 (一部のロシアの開発者はゼロから実装するよう提案したが、それは私の予算外だった)。

しかし、私はアイデアを実証するためにPHPの概念証明を作成しました。他の言語のためにこれを開発することに関心のある人々を得るでしょう。ここで

は、PHPは、概念実証です:

http://code.google.com/p/php-mock-recorder/

+0

ありがとうございました。 確かに。モックは行動を再現するはずです。コンポーネント自体というよりも、コンポーネントとのやり取りを記述する方が良いでしょうか?これは、オブジェクト上のテストハーネスを縛る努力がはるかに簡単で、削減可能になるでしょう。既定で相互作用するすべてのものを単にラップするだけです。 対話が存在しないか、あまりにも強すぎる場合など、記録された対話がテストケースで記述することに意味がない場合は、おそらく依存関係の境界の選択肢を再考する必要があります。 問題へのより実用的なアプローチ。 – Tormod

関連する問題