سؤال

استخدام 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._invokececonstructor (طريقة iruntimemethodinfo ، كائن [] args ، signaturestruct و signature ، runtimeType ExclaringType)

إذن - كيف تتأكد من أن Autofixture يمر في مجموعة مجهولة من الشركاء من أجل بنائه؟


إنه ليس خطأ من 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 طريقة. إذن - يصبح السؤال - كيفية التأكد من أن Autofixture يملأ بعض القضبان في مجموعة القضبان قبل إنشاء Foos؟

هل كانت مفيدة؟

المحلول

هذا يساعد. التصفح مصدر في كثير من الأحيان يساعد.

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 للخصائص أيضا. يدعو العميل إلى استخدامها مباشرة بدلاً من المرور عبر الجذر الكلي.

هناك عيب واحد عند استخدام params. لا يمكن استخدام أكثر من واحد (إلا إذا فقدت بعض الأساسيات مرة أخرى). وأنا أتلقى قائمة كإدخال (جزء من ورقة Excel DOM) ، لا يمكنني معرفة وقت الترجمة مقدار العناصر الموجودة هناك.

النموذج جديد حقا. ما عليك سوى خبزها (لذلك هناك فرصة كبيرة لأنني مخطئ في فحوصات الفراغ هذه ، سوف تتحدث مع العميل ومحلل الأعمال حول ذلك).

استراتيجيتي هي نحتها بحرية ودفعها نحو الحالة المطلوبة مع اختبارات الوحدة. هذا هو السبب الفعلي في أنني لا أحب TDD الصارم قليلاً. إنه يسرق التركيز ، ويجبرني على التفكير في التفاصيل بدلاً من الصورة الكاملة في وقت مبكر جدًا. أفضل رسمها وصقلها حتى تبدو جيدة. لكن هذا قد يكون السبب في أنني لست بطلاقة بدرجة كافية مع الاختبار.

على أي حال - شكرا لك على النصائح الرائعة. سأستمر في معرفة المزيد عن AutoFixture.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top