سؤال

على ما يرام.

لذا أعتقد أن الوقت قد حان للدخول في اختبار الوحدة، نظرًا لأن الجميع كانوا يتحدثون عنها لفترة طويلة بما فيه الكفاية.لقد قمت بتثبيت NUnit وخضعت لبعض البرامج التعليمية من نوع "مقدمة لاختبار الوحدة".

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

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

أي مؤشرات؟

الحروق

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

المحلول

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

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

أعلم أن هذا يبدو يتطلب الكثير من العمل ويبدو أنه حل بديل، ولكن إذا اعتدت على ذلك، فستكون بنية رائعة حقًا تجعل تغيير سلوك واجهة المستخدم أسهل بكثير.يمكنك دائمًا البدء في استخدام إطار عمل mvc "الحقيقي" عندما تحتاج إليه حقًا :-)

نصائح أخرى

يستخدم assembly:InternalsVisibleTo السمة وستكون قادرًا على الوصول إلى هؤلاء الأعضاء الخاصين.

ضعه في مشروع التحكم في الويب الخاص بك معلومات التجميع.cs (تحت ملكيات العقدة)

[assembly:InternalsVisibleTo("YourTestProjectName")]

لقد وجدت أكبر نقطة ألم في ASP.NET.بقدر ما هي مختومة، والفصول الخاصة التي تعيق اختبار الوحدة.

هذا هو السبب الرئيسي وراء استخدام موظفي TDD لإطار عمل MVC (ASP.NET MVC، Castle MonoRail) لأنه يوفر فصلًا واضحًا عن قوالب العرض الخاصة بك ومنطق وحدة التحكم الخاصة بك.وحدات التحكم قابلة للاختبار بالكامل.

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

نأمل أن يساعد ...

هذا هذه مقالة قديمة الآن، لكنني كنت أستخدم NUnitASP لكتابة اختبارات nunit لـ asp.net WebControls في عام 2004.تقدم هذه المقالة مثالاً تفصيليًا لاختبار عنصر تحكم بسيط باستخدام مفهومهم المتمثل في إنشاء فئة "مختبر" مقابلة تتضمن تفاصيل عنصر التحكم الخاص بك من اختباراتك.يمكن (ينبغي) أن يكون المُختبر أيضًا في نفس التجميع الذي يوجد به عنصر التحكم الخاص بك حتى يتمكن من مشاركة بعض الأشياء بينهما (على سبيل المثال.وظائف المنفعة والثوابت وما إلى ذلك).

لقد استخدمت هذه التقنية (وآخرون يستخدمون أشكالًا مختلفة من التقنية) حتى اليوم لاختبار عناصر تحكم معقدة للغاية.

اتمنى ان يكون هاذا مساعدا.

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

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

يمكنك أيضًا إلقاء نظرة على هذا وحيد القرن القباني نطاق.إنه إطار عمل MVC مخترق لـ WebForms.

إيفونايمكن اختبار WebControls بمعزل عن ذلك ، ضمن سياق ASP.NET فقط Call Session.getControl ("path.ascx") والتحقق من أن جميع الخصائص الضرورية.

يمكنك اختبارهم مثل هذا:

[Test]
public void ConditionQueryBuilderTest_RendersProperHtml()
{
    var sw = new StringWriter();
    var queryBuilder = new ConditionQueryBuilderStub
    {
        ID = "UnitTestbuilder",
        QueryBuilderURL = @"\SomeAspxPage\SomeWebMethod",
        ResetQueryBuilderURL = @"\SomeAspxPage\OnQueryBuilderReset",
        FilterValuesCollection = new Dictionary<int, string> { {15, "Some Condition"}}
    };
    queryBuilder.RenderAllContents(new HtmlTextWriter(sw));

    AppendLog(sw.ToString());

    Assert.AreEqual(ExpectedHtml, sw.ToString()); // ExpectedHTML is the raw expected HTML
}

هنا كعب بلدي:

internal class ConditionQueryBuilderStub : ConditionQueryBuilder // ConditionQueryBuilder is a WebControl
{
    internal void RenderAllContents(HtmlTextWriter writer)
    {
        RenderContents(writer);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top