4

autofixtureを使用して、次の匿名インスタンスを作成しようとしています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:値が期待される範囲内にありません。
System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method、Object [] args、SignatureStruct&signature、RuntimeType declaringType)で

それで、autoFixtureを構築するために、パートナーの匿名コレクションでautoFixtureがパスすることを確認するにはどうすればよいですか?


のせいではありませんIList<Partners>。と呼ばれる別のパラメータがありますPriorityPriorityそれ自体がコンストラクターを保持しMeasureMeasure保持し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。だから-問題は-fooを構築する前にAutoFixtureがバーコレクションのいくつかのバーを埋めることを確認する方法は?

4

1 に答える 1

1

これは役に立ちます。ソースを閲覧すると役立つことがよくあります。

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プロパティにも使用しています。これにより、クライアントは、集約ルートを経由する代わりに、それらを直接使用するようになります。

を使用する場合の欠点が1つありparamsます。複数使用することはできません(基本をもう一度見逃していない限り)。そして、入力としてリストを受け取っています(ExcelシートDOMの一部)。コンパイル時にどのくらいの要素が含まれるかわかりません。

モデルは本当に新鮮です。焼き上げたばかりです(したがって、これらの空のチェックについて間違っている可能性が高いので、クライアントやビジネスアナリストと話し合います)。

私の戦略は、それを自由に彫刻し、単体テストで目的の状態に向けてプッシュすることです。これが、厳密なTDDが少し嫌いな実際の理由です。それは焦点を奪い、私に全体像の代わりに細部について考えることを余儀なくさせます。私はそれをスケッチして、見栄えが良くなるまで洗練することを好みます。しかし、それは私がテストに十分に堪能でない原因かもしれません。

とにかく-素晴らしいヒントをありがとう。AutoFixtureについては引き続き学習します。

于 2010-09-09T14:04:53.660 に答える