كيف يمكنني اختبار وحدة خدمة WCF؟
-
09-06-2019 - |
سؤال
لدينا مجموعة كاملة من ملفات 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 الرقيقة.إذا كان رقيقًا حقًا ولا يوجد كود مثير للاهتمام، فلا تهتم باختباره.لا تخف من عدم اختبار الوحدة لشيء ما إذا لم يكن هناك رمز حقيقي هناك.إذا كان الاختبار لا يمكن أن يكون على الأقل بمستوى واحد أبسط من الكود الموجود تحت الاختبار، فلا تهتم.إذا كان الكود غبيًا، فسيكون الاختبار غبيًا أيضًا.لا ترغب في الحصول على المزيد من التعليمات البرمجية الغبية للحفاظ عليها.
إذا كان بإمكانك إجراء اختبارات تصل إلى قواعد البيانات، فهذا رائع!إنه أفضل.إنه ليس "اختبار الوحدة الحقيقي؟" ليست مشكلة على الإطلاق.