c# - كيفية تزوير طريقة DbContext.Entry في Entity Framework بنمط المستودع




entity-framework unit-testing (2)

لأنني أرغب في اختبار الوحدة البرمجية الخاصة بي ، فقد قمت بتطبيق نمط المستودع في تطبيق MVC4 الخاص بي. تمكنت من إنشاء واجهة سياق ، سياق مزيف واستخدام تطبيق زائف من System.Data.Entity.DbSet باتباع this الرمز.

لسوء الحظ ، تماما مثل اثنين من الملصقات قبلي ( here here ) ، لا أستطيع أن DbContext.Entry method . يمكنني استخدام هذه الطريقة لتحديث إدخالات قاعدة البيانات في التعليمة البرمجية الخاصة بي كما يلي:

DbContext.Entry(order).State = EntityState.Modified;

لم أجد حلاً لهذه المشكلة ، فقط الأشخاص الذين يقولون أشياء مثل:

"وما هو الهدف من وحدة اختبار هذا الرمز؟ أنت وهمية أسلوب البحث ، ثم قمت وهمية DbEntityEntry ، ولن يكون هناك أي منطق حقيقي لاختبار".

أو ل

اقرأ this وكل الأسئلة المرتبطة قبل المتابعة. (...) إذا كنت ترغب في اختبار مستودعاتك ، فأنشئ اختبارات تكامل تتحدث إلى قاعدة البيانات الحقيقية.

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

الخطأ الذي أتلقاه عند محاولة بعض عمليات التنفيذ هو أن Error 2 'Project.Models.Order' does not contain a definition for 'State' and no extension method 'State' accepting a first argument of type '[whatever return type I use]' could be found (are you missing a using directive or an assembly reference?)

آمل أن يساعدني أحدهم في إجراء طريقة DbContext.Entry مزيفة.


العثور على الإجابة here عن طريق "إضافة مستوى إضافي من الارتياب" نحصل عليه:

public void SetModified(object entity)
{
    Entry(entity).State = EntityState.Modified;
}

واستخدم DbContext.SetModified(entity) في جهاز التحكم الخاص بنا.


للالتفاف على هذا أضفت طريقة الزائد ، وأضاف سمة عفا عليها الزمن لمعرفة أين تم استدعاء الأسلوب الأصلي.

    public virtual void Entry<TEntity>(TEntity entity, Action<DbEntityEntry<TEntity>> action) where TEntity : class
    {
        action(base.Entry(entity));
    }

    [Obsolete("Use overload for unit tests.")]
    public new DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class
    {
        return base.Entry(entity);

        /** or **/

        throw new ApplicationException("Use overload for unit tests.");
    }

ثم يمكنك DbContext.Entry(order, ent => ent.State = EntityState.Modified;





repository-pattern