5

ArcGISの単体テストを変更して、モックを使い始めようとしています(rhinoを使用しています)。
テストを書き始めたとき、多くのオブジェクトをモックし始め、1つのテストでも合格するために多くのメソッドをスタブ化する必要があることに気付きました。
たとえば、私のコントローラーは最初にRelationshipClass(をスタブしIWorkspace、返されたIRelationshipClass)を取得し、次にIFeature(Aスタブ)を取得し、最後にを呼び出して、他ののstubRelClass.GetRelatedObjects(stubFeature)を返します。 ISetIFeatures

通過させるためだけに非常に多くのオブジェクトとメソッドをスタブ化する必要があるのは正常ですか?また、次に何をスタブし、何を返すかを理解するために、コードをステップオーバーする必要があるように感じます(ええ、最初にテストを作成する必要がありましたが、まだこれを試しています)。

また、複数のインターフェイスを実装するcomクラスのモックにも問題があります。プロダクションコードでは、インターフェイス間でQIを実行します。実行時に両方のインターフェースを実装するモックを作成するにはどうすればよいですか?

4

3 に答える 3

3

インジェクション チェーンによっては、はい、多くのオブジェクトをモックする必要がある場合があります。ただし、複数のレベルを深くする場合は、設計上の欠陥を示している可能性があります。API の 3 層下にあるデータに依存しているオブジェクトが疎結合されていない可能性があります。ある時点で、テストしているレイヤーが必要とする必要なプロパティを持つある種の偽のオブジェクトを返すだけで、チェーンをつぼみに挟むことができるはずです。

また、ほとんどのモックを[SetUp]メソッドで実行してから、各テストで 1 つか 2 つのことを変更するだけでよいはずです。

複数のインターフェースをモックするために、Rhino には MultiMock の概念があります。あなたが求めている構文は次のとおりだと思います:

var mock = 
    MockRepository.DynamicMultiMock<MyType>(
              typeof(Interface1), 
              typeof(Interface2), 
              ....);
于 2009-06-29T06:30:18.580 に答える
3

これは、高い結合の兆候である可能性があります。これは、依存関係を減らす必要があることを意味します (これにより、設計とテスト容易性が向上します)。大まかなガイドラインとして、オブジェクトには最大で 4 ~ 6 人の共同作業者が必要です。それを超えると、アラームが鳴ります。

モックはどのように使用されることを意図していますか?

于 2009-06-29T06:42:25.627 に答える
2

私には、テストできないコードのように聞こえますが、これはにおいです:-(

http://misko.hevery.com/code-reviewers-guide/を読むことをお勧めします。著者は、テスト領域で Google 開発者を教える責任を負うコーチです。この記事では、テスト可能なコードとテストできないコードを作成する方法を示しています。

さらに推奨される読み物: Clean Code (Robert C. Martin) - クリーンな (テスト可能な) コードの書き方に主眼を置いています。レガシー コードの効果的な作業 (Michael Feather) - テストされていないコードとテスト不可能なコードを管理下に置く方法を示します。

于 2009-06-29T06:30:41.933 に答える