سؤال

هذا صعب نظرًا لأن الكثير من الأشخاص يستخدمون PEX & moles أو هكذا أعتقد (على الرغم من أن PEX منتج رائع حقًا - أفضل بكثير من أي أداة اختبار وحدة أخرى)

انا املك بيانات المشروع الذي يحتوي على نموذج بسيط للغاية مع كيان واحد فقط (DBItem). لقد كتبت أيضًا DBRepository ضمن هذا المشروع ، يتلاعب هذا النموذج EF. المستودع لديه طريقة تسمى GetItems() التي تُرجع قائمة من عناصر طبقة العمل (BLItem) وتبدو مشابهة لهذا (مثال مبسط):

public IList<BLItem> GetItems()
{
    using (var ctx = new EFContext("name=MyWebConfigConnectionName"))
    {
        DateTime limit = DateTime.Today.AddDays(-10);
        IList<DBItem> result = ctx.Items.Where(i => i.Changed > limit).ToList();
        return result.ConvertAll(i => i.ToBusinessObject());
    }
}

لذا ، أود الآن إنشاء بعض اختبارات الوحدة لهذه الطريقة بالذات. أنا استخدم PEX & moles. لقد قمت بإنشاء الشامات والعبور لسياق كائن EF الخاص بي.

أرغب في كتابة اختبار الوحدة المعامل (أعلم أنني كتبت أولاً رمز الإنتاج الخاص بي ، لكنني اضطررت إلى ذلك ، لأنني أختبر PEX & Moles) أن هذه الطريقة تُرجع قائمة صالحة للعناصر.

هذا هو فصل الاختبار الخاص بي:

[PexClass]
public class RepoTest
{
    [PexMethod]
    public void GetItemsTest(ObjectSet<DBItem> items)
    {
        MEFContext.ConstructorString = (@this, name) => {
             var mole = new SEFContext();
        };

        DBRepository repo = new DBRepository();
        IList<BLItem> result = repo.GetItems();

        IList<DBItem> manual = items.Where(i => i.Changed > DateTime.Today.AddDays(-10));

        if (result.Count != manual.Count)
        {
            throw new Exception();
        }
    }
}

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

[Test]
[PexGeneratedBy(typeof(RepoTest))]
[Ignore("the test state was: path bounds exceeded")]
public void DBRepository_GetTasks22301()
{
    this.GetItemsTest((ObjectSet<DBItem>)null);
}

كان هذا تعليقًا إضافيًا قدمته PEX:

ركضت حالة الاختبار لفترة طويلة لهذه المدخلات ، وأوقفت PEX التحليل. يرجى ملاحظة: تم استدعاء الطريقة dilevious.data.test.repositories.TaskRepositoryTest.b__0 50 مرة ؛ يرجى التحقق من أن الرمز غير عالق في حلقة أو عودة لا حصر لها. خلاف ذلك ، انقر فوق "Set MaxStack = 200" ، وقم بتشغيل PEX مرة أخرى.

سمة التحديث [PexMethod (MaxStack = 200)

سؤال

هل أفعل هذا بالطريقة الصحيحة أم لا؟ هل يجب علي استخدام كعب Efcontext بدلاً من ذلك؟ هل يجب علي إضافة سمات إضافية إلى طريقة الاختبار بحيث يتم تشغيل مضيف Moles (لست متأكدًا من ذلك الآن). أنا أركض فقط PEX & moles. لا اختبار مقابل اختبار أو نونيت أو أي شيء آخر.

أعتقد أنه من المحتمل أن أقوم بتعيين بعض الحد على PEX بعدد العناصر التي يجب أن توفرها لطريقة الاختبار هذه.

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

المحلول

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

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

نصائح أخرى

أنا فقط أحصل على السيطرة على PEX أيضًا ... أحاطت مشكلاتي لي الرغبة في استخدامها مع MOQ ؛)

على أي حال ...

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

الشيء الوحيد الذي يجب أن تكون على الأرجح هو تمرير جميع الكائنات التابعة كمعلمات ... أي لا تنشئ الريبو في الطريقة ولكن تمريرها.

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

يمكنني استخدام PEX على منطق عملي والأشياء.

إذا كنت سأحاول اختبار معرف رمز DAL الخاص بي ، فيجب أن تستخدم IOC لتمرير DataContext إلى الطرق - مما يجعل الاختبار ممكنًا حيث يمكنك السخرية من سياق البيانات.

يجب عليك استخدام نمط مستودع إطار العمل: http://www.codeproject.com/kb/database/implrepositorypatternef.aspx

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top