سؤال

لدينا مجموعة كاملة من ملفات DLL التي تتيح لنا الوصول إلى قاعدة بياناتنا والتطبيقات والخدمات الأخرى.

لقد قمنا بتغليف ملفات DLL هذه بطبقة خدمة WCF رفيعة يستهلكها عملاؤنا بعد ذلك.

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

لذلك، أنا في حيرة من أمري بشأن ما يجب اختباره بالضبط وكيف.

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

المحلول

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

نصائح أخرى

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

على سبيل المثال، في الخدمة أدناه، قمت بتقسيم مستودع الوصول إلى البيانات الخاص بي باستخدام "حقنة التبعية للرجل الفقير".

Public Class ProductService
    Implements IProductService

    Private mRepository As IProductRepository

    Public Sub New()
        mRepository = New ProductRepository()
    End Sub

    Public Sub New(ByVal repository As IProductRepository)
        mRepository = repository
    End Sub

    Public Function GetProducts() As System.Collections.Generic.List(Of Product) Implements IProductService.GetProducts
        Return mRepository.GetProducts()
    End Function
End Class

على العميل، يمكنك الاستهزاء بخدمة WCF نفسها باستخدام واجهة عقد الخدمة.

<TestMethod()> _
Public Sub ShouldPopulateProductsListOnViewLoadWhenPostBackIsFalse()
    mMockery = New MockRepository()
    mView = DirectCast(mMockery.Stub(Of IProductView)(), IProductView)
    mProductService = DirectCast(mMockery.DynamicMock(Of IProductService)(), IProductService)
    mPresenter = New ProductPresenter(mView, mProductService)
    Dim ProductList As New List(Of Product)()
    ProductList.Add(New Product)
    Using mMockery.Record()
        SetupResult.For(mView.PageIsPostBack).Return(False).Repeat.Once()
        Expect.Call(mProductService.GetProducts()).Return(ProductList).Repeat.Once()
    End Using
    Using mMockery.Playback()
        mPresenter.OnViewLoad()
    End Using
    'Verify that we hit the service dependency during the method when postback is false
    Assert.AreEqual(1, mView.Products.Count)
    mMockery.VerifyAll()
End Sub

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

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

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