MS Dynamics Crm で、封印されたクラスと読み取り専用プロパティを使用していくつかのオブジェクトを返す状況があります (内部コンストラクターまたは内部プロパティ セットの使用のみを推測できます)。そして、これらの人は私が使用できるインターフェースから継承していません。明らかに、このコードを制御できれば、より多くの制御が可能になりますが、基盤となる MS Dynamics フレームワークに含まれているため、少し行き詰っています。
モック/オーバーライドしたいクラスはAliasedValueと呼ばれます。私がそれをモックしたい理由は、ダイナミクスへの呼び出しをシミュレートしようとしていて、エイリアス値が返されているふりをしたいからです。
シナリオは次のとおりです。Dynamics が返すサンプル エンティティを作成します。次のようなものです。
var new_entity = new Entity("new_entity")
{
Attributes = new AttributeCollection
{
{"new_name", "BR"},
{"createdon", DateTime.Now.AddDays(-1).Date},
{"new_field", "My field"},
{"new_contact", new AliasedValue {*****} }
}
};
したがって、「連絡先」エンティティを参照しています (リアルタイムでこれは AliasedValue として返されます)。テスト中に、コードがこのフィールドに返される可能性のある特定の値を処理することを確認したいと思います (たとえば、エイリアス値を処理する方法を知っている、リンクされた連絡先が返されない場合は爆発しないなど)。
したがって、AliasedValue へのリンクをクリックすると、プロパティが読み取り専用であることがわかります...そのため、テスト データを設定できません...
次に、独自のクラスを作成して全体をオーバーライドするつもりでしたが、封印されています...
それに加えて、おそらくご想像のとおり、Moq はシールされたクラスをモックしようとするのが好きではありません。
これを行うには「より良い」モッキングフレームワークを購入する必要があると読みましたが、この1つのことを回避するためだけに余分なお金を払う必要はありません。
これを回避するための素敵な小さな解決策を誰かが手に入れましたか?
明確化のための更新
これがどのように返されるかのサンプルは次のとおりです。上記のオブジェクトを返すためにモックされるサービスがあります。または、実際に返されるのは、上記のオブジェクトを含むコレクションです。したがって、これは次のようになります。
var service = new Mock<IOrganizationService>();
service
.Setup(s => s.RetrieveMultiple(null))
.Returns(new EntityCollection (new List<Entity> {new_entity}));
これは素晴らしいことです。上記のエンティティを返して、やりたいことを実行できます。したがって、上記のエンティティを作成し、モックされたサービスを介してそれを返した後、「EntityCollection」で上記を取得します。エンティティを取得したら、次のようにプロパティにアクセスします。
var aliasedContact = (AliasedValue)new_entity.Attributes["new_contact"];
たぶん私はばかげているかもしれませんが、答え(Lunivoreによる)がこれをどのように解決するかはよくわかりません...(フィードバックを得るためにコメントを追加しています...)