Autofixtureで複雑な子供を作成するときに親プロパティの値を使用する
-
27-10-2019 - |
質問
Autofixtureを使用して、親オブジェクトと複雑な子オブジェクトを含む構造のデータを生成します。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public Child[] Children { get; set; }
}
public class Child
{
public string Name { get; set; }
public int ParentId { get; set; }
}
プロパティを自動的に設定する方法はありますか ParentId
生成されたもの Child
親に割り当てられたIDにオブジェクト?今のところ私の解決策はこんな感じですが、それはあまりきれいではありません:
var parent = fixture.Build<Parent>().Without(p => p.Children).CreateAnonymous();
parent.Children = fixture.CreateMany<Child>(10).ToArray();
foreach (var i in parent.Children)
{
i.ParentId = parent.Id;
}
これを行うためのより良い方法が私が欠けているように感じますか?カスタムの作成を検討しました ISpecimenBuilder
しかし、それをそのように解決することもできませんでした。
解決
Autofixtureは、APIに関する一連のルールと仮定に基づいています。事前知識なしに作成および編集されたと考えてください Child
と Parent
クラス、または特定のAPIのその他のタイプ。それが操作しなければならないのは、パブリックAPIだけです。
Autofixtureは、あなたの言語さえ理解していない非常に薄暗いプログラマーと考えてください(英語でさえありません)。もっと フールプルーフ APIを作成できれば、Autofixtureを使用しやすくなります。
ここで説明する親/子の関係のような円形の参照の問題は、カプセル化を破ることです。最初は無効な状態でクラスインスタンスの少なくとも1つを作成する必要があります。このようなAPIを使用して自動フィクストールを機能させることが難しいことは、主にAPIがリファクタリングの恩恵を受ける可能性があるという警告サインと見なされるべきです。
さらに、.NETフレームワークの設計ガイドラインは、アレイをプロパティとして公開することに対して推奨されます。したがって、カプセル化されたデザインが良好であるため、Autofixtureとあなた自身と同僚の両方で、APIの作業がはるかに簡単かもしれません。
上記のAPIを考えると、これを操作しやすくする方法はわかりません。円形の参照を削除し、コレクションプロパティを読み取り専用にする方法を検討すると、はるかに簡単になります。
記録のために、私は何年も循環参照を含むAPIを書いていないので、それらの親と子の関係を避けることは非常に可能です。