سؤال

لذلك يجب الفئة التالية:

public class MyClass {
  internal void A() {
    foreach(Thing thing in ThingArray)
      B(thing);
  }

  virtual internal void B(Thing thing)
  {
    //  do some stuff
  }
}

ثم لدي الاختبار التالي:

...
var testObject = new Mock<MyClass>(parameters);
testObject.Setup(t => t.B(It.IsAny<Thing>()));

test.Object.A();

test.Verify(t => t.B(It.IsAny<Thing>()), Times.Exactly(2));

و التحقق من الفشل.لقد تحققت, و هو رمز الاتصال الحقيقي ب (طريقة) بدلا من سخر ب (طريقة).

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

لماذا على وجه الأرض ليس سخر الإعداد يجري إعدامهم ؟

تحرير:نعم ، لقد الداخلية مرئية اختبار المشروع.قصدت وضع هذا في الموقع الأصلي ، منذ علمت أن أحدهم ذكر ذلك.

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

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

المحلول

أنا لست متأكدا مما إذا كان Gamlor الجواب يعمل.ويبدو أنه إذا كنت ترغب في إجراء عملية الإعداد على الأسلوب حيث كنت تريد أن تحقق من أن Class1.MethodA المكالمات Class1.MethodB, MethodB (الذي هو واحد كنت تفعل الإعداد على) أن يكون العام (بغض النظر عن InternalsVisibleTo).كتبت اختبار بسيط تحت حالة مماثلة وجدت أنه بمجرد أن قمت MethodB العامة, موك بدأت العمل.أراهن إذا قمت ب الأسلوب العام سيكون العمل.

أفترض أن هذا هو القلعة أو موك علة ولكن لا أعرف على وجه اليقين.نأمل شخص ما سوف تتناغم.

أنا أعرف صنع MethodB العامة ليست خيارا جيدا.ولكن هذا هو ما أعرفه عن الوضع...

نصائح أخرى

الكائن الخاص بك وهمية لديها لتلبية هذه المقاييس من أجل جعل بنجاح تسخر من طريقة:

  • يجب أن يكون واجهة
  • أو الطريقة التي تريد أن تسخر يجب أن يكون أسلوب ظاهري العامة.

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

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

هذا جعل الداخلية الوصول إلى رمز مولد من موك.

وذلك من أجل السخرية MyClass.A اتصل عليك أن تفعل هذا:

  1. تجعلك الأسلوب الظاهري.
  2. وجعل الأسلوب العامة أو السماح بالوصول مع

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    

أو كما قال ، الذي يمثل واجهة API من MyClass.

موك لا التفاف التعليمات البرمجية الموجودة, ولكن بدلا من ذلك يخلق فارغة وهمية.

وهذا يعني أن الدعوة testObject.الكائن.أ() لا تنفيذ البرمجية الأصلية ، لذلك ب يسمى أبدا.

إذا كنت أدعي الخاص بك ساخرا واجهة ثم هذا منطقي لأن واجهات لم يكن لديك رمز, حتى لا وهمية.

حاول إنشاء وهمية مثل هذا (أنا لم أحاول ذلك لذلك أنا لا أعرف إذا كان يعمل):

var testObject= new Mock<MyClass> { CallBase = true };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top