Rhinoでの模擬抽象クラスのデフォルトの動作
-
05-07-2019 - |
質問
あざけるのはかなり新しいので、まだ取り上げていないかもしれませんが、良い例はどこにも見つかりません。
デフォルトでは、抽象クラスから継承するクラスはコンストラクターでコレクションをインスタンス化することをアサートしようとしています。抽象クラスは次のとおりです。
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>
(またはスタブ)を実行すると、コンストラクターが実行され、モックのプライベートフィールド<!> quot; _params
<!> quot;初期化されますが、モックの<!> quot; Parameters
<!> quot;プロパティは単にnullです。
明らかに、生成されたモックサブクラスはプロパティの実装をオーバーライドしています。 Parametersプロパティを再実装から除外する方法はありますか?
ありがとう。
解決
わかりました、わかりました。 Rhinoの複雑さに対するもう1つの犠牲者として私に連絡してください。この種のことで、よりシンプルなフレームワークに移行したいと思うようになりました。おそらく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");
}
}
これはステートフルテストであることがわかりますが、実際には、問題のプロパティを含むいくつかの動作テストのより簡単なプレリュードであるため、このケースを前提条件にしたかったのです。それが誰かを助けることを願っています。
他のヒント
_paramsを仮想化してみてください