أكرينو السخرط assertwascalled (عدة مرات) على الممتلكات Getter باستخدام AAA

StackOverflow https://stackoverflow.com/questions/729267

سؤال

لدي كائن مدخر يتم تمريره كوسيطة منشئ إلى كائن آخر.

كيف يمكنني اختبار أن عقار كائن مدهش قد تم استدعاؤه؟ هذا هو الرمز الذي أستخدمه حاليا:

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });

هذا يعمل باستثناء ما إذا كان داخل "ضمانات" يتم استخدام خاصية Geter On Forenames عدة مرات. هذا عندما أحصل على "Ryino.mocks.exceptions.exfeventationViolationException: INEWCONTACTATTRIBICETS.GET_FORENAMES ()؛ المتوقع # 1، الفعلي # 2 .."

ببساطة باستخدام

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());

لا يعمل ويعطي الخطأ أدناه:

"تمت إزالة التوقع من قائمة توقعات الانتظار، هل استدعاء كرر. أي ()؟ هذا غير مدعوم في assertwascalled ()".

فكيف يمكنني تلبية المكالمات المتعددة؟

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

المحلول

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any لا يعمل مع AssertWasCalled لأن 0 يهم أي ... لذلك إذا لم يتم استدعاؤه، AsserWasCalled سوف يعود صحيحا حتى لو لم يتم استدعاؤه.

نصائح أخرى

وأنا أتفق مع إجابة كريس

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

بالإضافة إلى ذلك، إذا كنت تعرف بالضبط عدد المرات التي سيتم فيها تسمية الممتلكات التي يمكنك القيام بها

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));

حيث ن هو int.

ما هو الدافع وراء التحقق من عدد المرات التي يطلق عليها؟ هل هي عملية غالية للغاية؟ إذا كان الأمر كذلك، فأنا أقترح عليك أن تضعها وراء طريقة بدلا من ذلك، يجب أن تكون الخصائص من الدلالية مكالمات غير مكلفة.

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

اعتمادا على إصدار الخاص بك من وحيد القرن الذي تستخدمه، يمكنك استخدام:

// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();

newcontact.expect (c => c.forenames) .RETURN (...) .REPEAT.ANE ()

من هنا:

mock.AssertWasCalled(x => x.Name ="Bob");

أو

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));

أو

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top