質問
偽物を作成するときに読み取り専用フィールドをどのように処理しますか?
バックグラウンド
私はASP.NetMVCを使用する初心者の段階にあり、例としてStevenSandersonのSportsStoreとScottGuのNerdDinnerを使用しています。私が今直面した小さな問題の1つは、偽物を作成するときに読み取り専用プロパティをどのように操作するかです。LINQToSQLを使用しています。
私のインターフェースは:
public interface IPersonRespository
{
Person GetPerson(int id);
}
そして私の偽物は
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
これが私の問題です。フィールドid、ssn、およびtotalDrWhoEpisodesWatchedは読み取り専用であるため、上記のコードは実際には機能しません。ただし、偽の新しい人物を作成して読み取り専用プロパティを設定する方法がわかりません。解決策があると確信していますが、検索ではまだ解決策に出くわしていません。
更新:潜在的な解決策としての継承+プロパティの非表示?
私はまだ問題のしっかりした解決策を決めていません。偽物を作成する目的でドメインクラスを変更するという概念は嫌いです。私にとって、テストを行うためにドメインクラスにマークアップを追加することは、追加された結合の形式です。つまり、テストの実装への結合です。現在、別の可能性を調査しています。これは、Personから継承するが、新しい読み取り/書き込みプロパティでプロパティを非表示にするFakePersonクラスを作成することです。
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
これまでのところ、この解決策は私が傾いている方法です。それはリスコフの置換原則を破ります、しかしそれはテストプロジェクトで私をそれほど悩ませません。解決策として、これに対する批判やフィードバックを聞いてうれしいです。
勝者:モックフレームワーク
Moqがその仕事をしているようです。継承によってプロパティを非表示にする最後のソリューションは実際には機能しますが、Moqを使用することで、より保守しやすい標準化された機能セットを取得できます。他のモックフレームワークにもこの機能があると思いますが、チェックしていません。Moqは、私が今間違いなく書いている、最初の模擬執筆にとってより簡単であると言われています。