2009-08-18 3 views
4

私はテスト目的でSystem.Data.DataSetの前にインターフェイス(IDataSet)を使用しています。私はCopy()メソッドを模倣できるようにしたい。基本的には、同じ模擬オブジェクトのコピー/クローンが必要です。Moq Mock <>を値でコピーする方法はありますか?

ここに私がしたいと思う疑似コードがあります。

Mock<IDataSet> dataMock = new Mock<IDataSet>(); 
Mock<IDataSet> copyMock = ??? // How do I clone the mock? 

dataMock.Setup(c => c.Copy()).Returns(copyMock.Object); 

これは可能ですか?

答えて

4

基本的にモックは本物ではないため、実際の動作はありません。実際の行動を取るべきではありません。何が起こったのかを把握しながら、あなたが何を話していてもそれをするはずです。それ以上のことはありません。

これは、は、そのCopyメソッドがどのように機能するかを伝える必要があることを意味します。あなたは次の操作を行う場合は、 implmementationだは、Copyメソッドがあります:

Mock<IDataSet> dataMock = new Mock<IDataSet>(); 
Mock<IDataSet> copyMock = new Mock<IDataSet>(); 

dataMock.Setup(c => c.Copy()).Returns(copyMock.Object); 

をしかし、あなたもこれを行うことができます:は、その後の実装になっていること

Mock<IDataSet> dataMock = new Mock<IDataSet>(); 
Mock<IDataSet> copyMock = dataMock; 

dataMock.Setup(c => c.Copy()).Returns(copyMock.Object); 

をCopyメソッド。覚えておいてください:インターフェイスは、メソッドが何をすべきかを述べた契約ではありません。メソッドのシグネチャのみを定義します。

おそらく、IDataSetのデータを別のIDataSetにコピーすることを望んでいましたが、Mockは純粋な動作であることに注意してください。データはありません。

あなたが考えることができます代替案のカップルは、以下の通りである:

  • は抽象DataSetBaseクラスでIDataSetを交換し、そしてあなたはそれが動作するようにしたいようにCopyメソッドを実装する(つまり、などないです抽象的または仮想的な方法)。
  • IDataSetのモックを作成する代わりに、偽を使用します。 A Fakeは、実物に近い動作を持つインターフェイスのテスト指定実装です。 Fakeを作成するためのフレームワーク/ライブラリはありませんので、手作業でそのようなFakeをコーディングする必要があります。
  • Copyメソッドが実際にインターフェイスの一部であるべきかどうかを検討します。それは最初の場所でインターフェイスに属していない実装の詳細のような私に聞こえる。

優れた本xUnit Test Patternsで、スタブ、モック、フェイク、その他のユニットテストパターンについて読むことができます。

+0

あなたの洞察に感謝します。 "dataMock"を偽に切り替えると、私が入っていた袋から私を得ました。 –

+0

+1 - 素敵な答え!私はあなたが返品(Func)またはコールバック(アクション)を行うことができるので、MoqがあなたにFakesを作成させると主張します。しかし、手作業によるFakeは読みやすくなるかもしれません。 – TrueWill

+1

@TrueWill:それは有効な点ですが、最も重要なのは、私が別の文脈で作ったことです。Test Doublesは漠然と定義された連続体に存在します。http://msdn.microsoft.com/en-us/magazine/cc163358.aspx –

関連する問題