سؤال

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

يمكنني تعيين علامة عند الانتهاء دون تعديل Sut ولكن هذا يعني أنني سوف أضطر إلى التحقق من العلم في حلقة أثناء الوقت، مع مهلة ربما.

ما هي خياراتي؟

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

المحلول

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

[Test]
public void CanTestAsync()
{
    MyObject instance = new MyObject()
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Finished" event
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    {
        waitHandle.Set();  // signal that the finished event was raised
    } 
    instance.AsyncMethodFinished += eventHandler;

    // call the async method
    instance.CallAsyncMethod();

    // Wait until the event handler is invoked
    if (!waitHandle.WaitOne(5000, false))  
    {  
        Assert.Fail("Test timed out.");  
    }  
    instance.AsyncMethodFinished -= eventHandler;    
    Assert.AreEqual("expected", instance.ValueToCheck);
}

نصائح أخرى

فقط اعتقدت أنك قد ترغب في تحديث على هذا نظرا لأن الإجابة رقم 1 توصي فعلا بنمط أقدم لحل هذه المشكلة.

في .NET 4.5 + XUNIT 1.9 أو أعلى، يمكنك ببساطة إرجاع مهمة ولا تستخدم اختياريا الكلمة الأساسية ASYNC من اختبارك للحصول على XUNIT الانتظار لإكمال الاختبار لاستكمال غير متزامن.

انظر هذا المقال XUNIT.NET 1.9.

[Fact]
public async Task MyAsyncUnitTest()
{    
  // ... setup code here ...     
  var result = await CallMyAsyncApi(...);     
  // ... assertions here ...
}

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

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

تحقق من مقالي حول اختبار وحدة تطبيقات Silverlight

http://www.codeProject.com/kb/silverlight/ag3demolob.aspx.

هناك مثال على اختبار الوحدة طريقة تستدعي خدمة WCF بشكل غير متزامن ...

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