ilist コンストラクターパラメーターとオートフィクストール
-
01-10-2019 - |
質問
使用 オートフィックス, 、匿名のインスタンスを構築しようとしています Project
:
_f=new Fixture().Customize(new AutoMoqCustomization());
_p=_f.CreateAnonymous<Project>();
これは失敗します、原因です Project
パブリックコンストラクターの要求 IList<Partner>
public Project(/*.....*/,IList<Partner> partners){
Guard.AgainstEmpty(partners);
}
スタックトレースは意味がありません(少なくとも私にとっては)。ちょうどいくつかの反射ヤダ・ヤダ:
失敗:System.Reflection.TargetInVocationException:呼び出しのターゲットによって例外がスローされています。
---- System.ArgumentException:値は予想される範囲内に該当しません。
at System.RuntimeMethodhandle._InvokeConstructor(iruntimemethodinfoメソッド、オブジェクト[] args、signatureStruct&signature、runtimeType declaringType)
それで - それを構築するためにパートナーの匿名のコレクションに自動フィックスチャーが通過することを確認する方法は?
それはのせいではありません IList<Partners>
. 。呼ばれる別のパラメーターがあります Priority
. Priority
それ自体が保持されます Measure
, Measure
保留 IList<Indicator>
と電話 Guard.AgainstEmpty(indicators)
コンストラクターで。
だからそれは次のように見えます:
fixture.CreateAnonymous<Foo>(); //kaboom!
public class Foo{
public Foo(IList<Bar> bars){
Guard.AgainstEmpty(bars); //just checks count for ienumerable & throws if 0
Bars=bars;
}
public IList<Bar> Bars {get;private set;} //should be readonly collection...
}
public class Fizz{
public Fizz(Foo foo){
Foo=foo;
}
public Foo{get;private set;}
}
public class Bar{}
建設が失敗します Guard.AgainstEmpty
方法。だから - 質問は - フースを構築する前に、自動フィクストールがバーコレクションのいくつかのバーを埋めることを確認する方法は?
解決
これは役立ちます。ブラウジング ソース 多くの場合役立ちます。
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
しかし、より良い方法があるかもしれません。
全体として、これは現時点での見方です:
_f=new Fixture().Customize(new AutoMoqCustomization());
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
var regionName=_f.CreateAnonymous<string>();
_f.Register<string,Country,bool,Region>((name,country,call)=>
new Region(regionName,_f.CreateAnonymous<Country>(),true));
_c.Set(x=>x.Regions,_f.CreateMany<Region>().ToList());
_f.Register<IList<ManagementBoardEntry>>(()=>
_f.CreateMany<ManagementBoardEntry>().ToList());
_f.Register<IList<FinancialInfoEntry>>(()=>
_f.CreateMany<FinancialInfoEntry>().ToList());
_f.Register<IList<Partner>>(()=>_f.CreateMany<Partner>().ToList());
_p=_f.CreateAnonymous<Project>();
それを美しいと呼ぶことはできません(リファクタリングの提案は大歓迎です)が、すべてを手動で書くよりもはるかに優れています。
使用 IList
確かに間違った選択があります。さらに悪いことに - 私は使用しています IList
プロパティの場合も。これにより、クライアントは総rootを使用する代わりに直接使用するように誘います。
使用するときに1つの欠点があります params
. 。複数の使用はできません(再び基本がない限り)。そして、私は入力(Excel Sheet DOMの一部)としてリストを受け取っています。コンパイル時間がわかりません。
モデルは本当に新鮮です。それを焼いただけです(だから私はそれらの空虚チェックについて間違っている可能性があり、それについてクライアントとビジネスアナリストと話をします)。
私の戦略は、それを自由に彫刻し、ユニットテストで希望の状態に向かってプッシュすることです。これが、私が厳格なTDDを少し嫌う実際の理由です。それは焦点を盗み、全体像の代わりに詳細について考えるように強制します。私はそれをスケッチして、見た目が良くなるまで洗練することを好みます。しかし、それは私がテストで十分に流fluentしていないからかもしれません。
とにかく - 素晴らしいヒントをありがとう。 Autofixtureについて詳しく知り続けます。