2009-03-06 6 views
3

私はまったく新しいものですので、これは私がまだ取り上げていないかもしれませんが、どこでも良い例を見つけることはできません。Rhinoのモック抽象クラスのデフォルト動作を模擬しました

私は、デフォルトでは、抽象クラスから継承するすべてのクラスがコンストラクタでコレクションをインスタンス化することをアサーションしようとしています。

public abstract class DataCollectionWorkflow : SequentialWorkflowActivity 
{ 
     private readonly DataSet _output = new DataSet(); 
     private List<DataCollectionParameter> _params = null; 

     public DataCollectionWorkflow() 
     { 
      _params = new List<DataCollectionParameter>(); 
     } 

     public virtual IList<DataCollectionParameter> Parameters 
     { 
      get { return _params; } 
      set { _params = (List<DataCollectionParameter>)value; } 
     } 
} 

これをRhinoとどうやって嘲笑しますか? GenerateMock<DataCollectionWorkflow>(またはスタブ)を実行すると、コンストラクタが実行され、モックのプライベートフィールド "_params"が初期化されますが、モックの "Parameters"プロパティは単にnullになります。

明らかに、生成された模擬サブクラスがプロパティの実装をオーバーライドしています。 Parametersプロパティを再実装しないようにする方法はありますか?

ありがとうございました。

答えて

5

わかりました。 Rhinoの複雑さにもう一つの犠牲者として私を台無しにする。このようなことは私がより単純なフレームワークに移行したいと思うかもしれません。多分私はMoQをチェックします。

答えはPartialMocksです。私は簡単に部分模擬を生成していましたが、その上でデバッガを実行したときに、プロパティがnullでもないことに気付きました。彼らは奇妙な例外を投げていたので、はるかに深くは見えませんでした。私は短い形式のAAAタイプの構文を使用していました。

私は単純にモックを再生モードにすると、テストが機能します。プロパティはそのまま使用されます(部分模擬である必要があります)。だからここ

は答えます:

[Test] 
public void ShouldCreateParameterListInConstructor() 
{ 
     var mockRepository = new MockRepository(); 
     var mock = mockRepository.PartialMock<DataCollectionWorkflow>(); 
     using (mockRepository.Record()) 
     { 

     } 
     using (mockRepository.Playback()) 
     { 
      Assert.That(mock.Parameters, Is.Not.Null, "DataCollectionWorkflow base class didn't create new param collection"); 
     } 
} 

私はこれがステートフルテストであることを認識し、それが実際に問題の性質を必要とするいくつかの行動試験にシンプルな前奏曲ですので、私は前提条件としてこのケースを望んでいました。誰かを助けることを願っています。

0

_paramsを仮想化してみてください。

+0

フィールドを仮想にすることはできません。問題は、Parametersプロパティがオーバーライドされ、フィールドではなくなります。フィールドはちょうど良い初期化され...それはもはや模擬のプロパティにリンクされていません。 – womp

関連する問題