Autofixture: احصل على مثيل للواجهة الداخلية التي تم إنشاؤها بواسطة AutoMoqData.

تم إنشاؤها على ٢٦ أبريل ٢٠١٨  ·  8تعليقات  ·  مصدر: AutoFixture/AutoFixture

أهلا،

أحاول الحصول على مثيل واجهة Mocked الداخلية التي أنشأتها AutoMoqData لإعداد الواجهة.

هل هناك طريقة لفعل شيء كهذا

[Theory, AutoMoqData]
public void Dummy(IFixture fixture, ComplexClassWithInnerInterface sut)
{
    fixture.GetInstance<IInnerInterfaceMockCreatedByAutoMoqData>().Setup(x => x.Method).Result(something);

    Assert.Equal(String.Empty, String.Empty);
}

شكرا

question

التعليق الأكثر فائدة

شكرا xxlecoustillier للإجابة الرائعة. في الأساس ، أقترح أن أفعل الشيء نفسه لأنني أتابع هذا النمط باستمرار في اختباراتي.

لكن بالنسبة لـ 30 واجهة ، من القبيح جدًا أن يتم تضمينها في معلمات الطريقة.

حسنًا ، هذه الحجة تبدو غريبة بعض الشيء. ربما يكون هناك خطأ ما في تصميم الكود الذي تم اختباره إذا كنت بحاجة إلى تكوين 30 تبعيات لعمل سيناريو 😟 أنا 99٪ ploeh يقترح عليك مراجعة الكود أولاً قبل المضي قدمًا ، وفقًا لنصيحته التي يوصى بها 3-4 تبعيات كحد أقصى 😅

لذلك يبدو من المستحيل الحصول على نماذج تم إنشاؤها تلقائيًا من حاوية التركيب. لا يتم حقنها بشكل افتراضي ، لذلك إذا كان للمثبت طريقة مثل GetInstance ، فلن يقوم بإرجاع أي شيء للنسخ التي تم إنشاؤها تلقائيًا.

لست متأكدًا بنسبة 100٪ من أنني فهمت الرسالة بالكامل بوضوح ، ولكن مما حصلت عليه أنت على صواب. بشكل افتراضي ، تكون جميع الكائنات التي تم إنشاؤها عابرة ولا يحتفظ بها fixture . إذا كنت ترغب في جعل كائن معينًا منفردًا ، فيجب عليك استخدام fixture.Freeze<>() API أو سمة [Frozen] أو أي واجهة برمجة تطبيقات أخرى مناسبة.
تم تصميم السلوك الافتراضي الحالي لتغطية السيناريوهات الشائعة وفي معظم الحالات _ لا تريد_ أن يكون لديك نفس الكائن لكل نوع.

إذا كنت لا تزال تبحث عن المساعدة من جانبنا ، فيرجى تقديم متطلبات أكثر دقة لديك. من الأفضل مشاركة ما يكفي من التعليمات البرمجية لإظهار القيود الحالية والهدف الذي ترغب في تحقيقه - سيساعد ذلك على المزامنة بشكل أفضل 😉

شكرا.

ال 8 كومينتر

محاولة

Mock.Get(sut).Setup(x => x.Method).Result(something);

ستحصل على كائن لم يتم إنشاؤه بواسطة Moq. الوصول إلى sut.

سيعمل هذا بالفعل إذا كانت الواجهة في ملكية عامة.
Mock.Get (sut.InnerInterface). الإعداد (x => x.Method). النتيجة (شيء) ؛

ولكن ماذا لو تم الاستهزاء بالواجهة وتم حقن المُنشئ ، وتسجيله في حاوية IoC ، ولكن لا يمكن الوصول إليه في خاتمة مع ملكية عامة؟

في هذه الحالة ، سيتعين عليك تجميد النموذج للتأكد من أن المثيل الذي تنشئه سيُحقن أيضًا في الخيط:

[Theory, AutoMoqData]
public void Dummy(
    IFixture fixture, 
    [Frozen]Mock<YourInnerInterface> innerInterfaceMock,
    ComplexClassWithInnerInterface sut)
{
    innerInterfaceMock.Setup(x => x.Method).Result(something);
    sut.DoSomething();
    Assert.Equal(String.Empty, String.Empty);
}

احرص دائمًا على إنشاء الأوساخ المجمدة قبل الخيط بحيث تكون موجودة بالفعل عند إنشاء الخيط وبالتالي يتم حقنها بشكل صحيح.

انظر ploeh'sblog للرجوع اليها.

أهلا،
كنت أفعل ذلك بالفعل. لكن بالنسبة لـ 30 واجهة ، من القبيح جدًا أن يتم تضمينها في معلمات الطريقة.
ذكّرني الرمز الخاص بك بأن AutoMoqData لا يجمد كافة الواجهات التي تم الاستهزاء بها. لذلك يبدو من المستحيل الحصول على نماذج تم إنشاؤها تلقائيًا من حاوية التركيب. لا يتم حقنها بشكل افتراضي ، لذلك إذا كان للمثبت طريقة مثل GetInstance ، فلن يقوم بإرجاع أي شيء للنسخ التي تم إنشاؤها تلقائيًا. هذا هو السبب في أنني أحصل على نسخ مكررة إذا قمت بتجميد النموذج باستخدام مثيل التثبيت. الطريقة الوحيدة التي أرى أنها ستنجح هي إذا كان من الممكن تحديث الختم باستخدام الخزائن المجمدة لاحقًا ، لكن هذا سيكون قبيحًا. الطريقة السهلة هي استخدام AutoMoqData لإنشاء نماذج IFixture والتجميد والإعداد في طريقة الاختبار ، ثم إنشاء sut. باستخدام هذا الإعداد ، يمكنني إنشاء طريقة مساعدة قابلة لإعادة الاستخدام لتجميد mocks وإعدادها.

شكرا

شكرا xxlecoustillier للإجابة الرائعة. في الأساس ، أقترح أن أفعل الشيء نفسه لأنني أتابع هذا النمط باستمرار في اختباراتي.

لكن بالنسبة لـ 30 واجهة ، من القبيح جدًا أن يتم تضمينها في معلمات الطريقة.

حسنًا ، هذه الحجة تبدو غريبة بعض الشيء. ربما يكون هناك خطأ ما في تصميم الكود الذي تم اختباره إذا كنت بحاجة إلى تكوين 30 تبعيات لعمل سيناريو 😟 أنا 99٪ ploeh يقترح عليك مراجعة الكود أولاً قبل المضي قدمًا ، وفقًا لنصيحته التي يوصى بها 3-4 تبعيات كحد أقصى 😅

لذلك يبدو من المستحيل الحصول على نماذج تم إنشاؤها تلقائيًا من حاوية التركيب. لا يتم حقنها بشكل افتراضي ، لذلك إذا كان للمثبت طريقة مثل GetInstance ، فلن يقوم بإرجاع أي شيء للنسخ التي تم إنشاؤها تلقائيًا.

لست متأكدًا بنسبة 100٪ من أنني فهمت الرسالة بالكامل بوضوح ، ولكن مما حصلت عليه أنت على صواب. بشكل افتراضي ، تكون جميع الكائنات التي تم إنشاؤها عابرة ولا يحتفظ بها fixture . إذا كنت ترغب في جعل كائن معينًا منفردًا ، فيجب عليك استخدام fixture.Freeze<>() API أو سمة [Frozen] أو أي واجهة برمجة تطبيقات أخرى مناسبة.
تم تصميم السلوك الافتراضي الحالي لتغطية السيناريوهات الشائعة وفي معظم الحالات _ لا تريد_ أن يكون لديك نفس الكائن لكل نوع.

إذا كنت لا تزال تبحث عن المساعدة من جانبنا ، فيرجى تقديم متطلبات أكثر دقة لديك. من الأفضل مشاركة ما يكفي من التعليمات البرمجية لإظهار القيود الحالية والهدف الذي ترغب في تحقيقه - سيساعد ذلك على المزامنة بشكل أفضل 😉

شكرا.

نعم ، أود أن أقترح أن 30 تبعيات كثيرة جدًا.

فيما يتعلق بالحصول على التبعيات المحقونة ، فإن استخدام السمة [Frozen] ، كما يقترح xlecoustillier ، هو أحد الخيارات ، وفي الواقع السبب في وجود السمة في الأصل.

استخدام Mock.Get(sut.Dep1) هو أيضًا خيار أستخدمه كثيرًا.

ولكن ماذا لو كانت الواجهة [...] حقنت المُنشئ [...] ولكن لا يمكن الوصول إليها مع ملكية عامة؟

لماذا لا نفضحها كممتلكات إذن؟ ما تؤلفه ، يمكنك أيضًا كشفه. . لا يكسر التغليف لفضحه.

أشعر برغبة في إضافة تجريدك الذي لن يكون أكثر من تسريب تطبيقك!

@ malylemire1 إغلاق هذا حيث يبدو أنه لا توجد حاجة إلى مزيد من المساعدة. يرجى إخبارنا إذا كان هناك أي شيء آخر يمكننا مساعدتك فيه 😉

شكرا مرة أخرى لطرح السؤال! 👍

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

josh-degraw picture josh-degraw  ·  4تعليقات

ploeh picture ploeh  ·  7تعليقات

DeafLight picture DeafLight  ·  5تعليقات

tomasaschan picture tomasaschan  ·  3تعليقات

Ridermansb picture Ridermansb  ·  4تعليقات