c# - كيف يجب على وحدة واحدة اختبار وحدة تحكم.NET MVC؟





asp.net-mvc-3 unit-testing controller (6)


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

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

var response = new TestSession().Get("/Users/List");
Assert.IsInstanceOf<UserListModel>(response.Model);

var model = (UserListModel) response.Model;
Assert.AreEqual(1, model.Users.Count);

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

أنا أبحث عن المشورة فيما يتعلق باختبار وحدة فعالة من وحدات التحكم .NET mvc.

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

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

هل يمكن لأي شخص أن يقترح بعض الأساليب الأفضل لاختبار وحدة التحكم أو يشرح لماذا تعتبر الطرق السابقة صالحة / مفيدة؟

شكر!




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

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

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

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

الإجابة على التعليق رقم 1

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

ويدعو سير العمل النموذجي الأحمر والأخضر - refactor لكتابة اختبارات الوحدة الخاصة بك قبل كتابة الطرق التي يختبرونها. (وهذا يعني لفترة زمنية قصيرة ، ولن يتم تجميع كود الاختبار الخاص بك ، ولهذا السبب يجد العديد من المطورين الشباب / قليل الخبرة صعوبة في تبني ريفاكتور أخضر أحمر).

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

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

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




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

عندما تتحدث عن المنطق المعقد ، فهذا لا يعني بالضرورة أن هذا المنطق لا يمكن فصله في طبقات مختلفة ويتم اختبار كل وحدة بمعزل عن غيرها.




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

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




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

لذلك في حالة أساليب "التحكم" ، التي ترجع ActionResults ، من المفيد جداً فحص قيمة ActionResult التي تم إرجاعها.

إلقاء نظرة على قسم "إنشاء اختبارات وحدة لالمراقبون" هنا لبعض الأمثلة واضحة جدا باستخدام Moq.

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

[TestMethod]
public void CreateInvalidContact()
{
    // Arrange
    var contact = new Contact();
    _service.Expect(s => s.CreateContact(contact)).Returns(false);
    var controller = new ContactController(_service.Object);

    // Act
    var result = (ViewResult)controller.Create(contact);

    // Assert
    Assert.AreEqual("Create", result.ViewName);
}



لقد استخدمت RCUNIT للقيام ببعض اختبارات الوحدة للشفرة المضمنة على جهاز الكمبيوتر قبل الاختبار على الهدف. تجريد واجهة الأجهزة الجيدة مهم آخر endianness وسجلات الذاكرة المعينة سوف تقتل لك.





c# asp.net-mvc-3 unit-testing controller