私はコードの到達が困難な部分、特にサイトコア クラス ライブラリ (モッキング フレームワークを使用するのが難しい) で見つかった型を使用する部分で単体テストを作成するためにモルを使用しています。私は、LinkField 型をほくろして、次の種類のコード スニペットをテストしようとしているときに、驚くほどトリッキーな問題に遭遇しました。
LinkField linkField = item.Fields["External Url"];
if (linkField.IsInternal && linkField.TargetItem != null)
{
// want to test this path
item.Fields は、インデクサーが SiteCore.Data.Field の型を返すフィールド コレクションですが、LinkField は、コード内で LinkField のインスタンスを操作できることを意味する変換を隠す暗黙の演算子を使用するように設定されています。
問題は、MLinkField 型のモグラを作成できず、Field に強く型付けされているため、これを Item の FieldCollection に割り当てることができないことです。さらに、MField の型を作成することはできますが、暗黙的な変換が発生すると、それは機能してオブジェクトを返しますが、どのフィールドも値を持つように設定されていないようです。これは、特定の方法で設定されている linkField の状態に依存する上記のコード パスをテストできないことを意味します。
これらの値を設定する唯一の方法は、間接的な方法です。つまり、暗黙的な変換を分析して MField に設定することで、設定する必要がある値を見つけます。暗黙の演算子は、次のように LinkField コンストラクターを呼び出します。
public LinkField(Field innerField) : base(innerField, "link")
つまり、基本型 (XmlField) をインスタンス化する方法と、そのクラスの基本型 (CustomField) をインスタンス化する方法を意識する必要があります。次に、TargetItem が探している基本的な値を確認します。最終結果は、モルアウトする必要があります。
InnerField.Database.Items[internalPath];
または
InnerField.Database.Items[targetID];
InnerField は実質的に私の MField です。
誰かがより良いアイデアを持っていますか? これはひどく複雑に聞こえますが、それがこれらのアセンブリの野獣の性質だと思います。