سؤال

أختبر بعض الكود الإرسال في الحدث في تطبيق Flex، باستخدام FlexUnit addAsync طريقة لاختبار أن الأحداث يتم إرسالها. عظيم حتى الآن، يمكنني ضمان إطلاق حدث واحد على الأقل. ومع ذلك، أريد أن أكون أكثر تفصيلا قليلا؛ أريد أن أضمن أن مجموعة الأحداث التي أتوقعها بالضبط يتم إرسالها. هل هناك نمط اختبار مفيد (أو حتى، حتى، إطار اختبار مختلف - أنا مرن!) لإنجاز هذا؟

حاولت هذا الرمز، لكن لا يبدو أنه يتم الاحتجاج بالمرة الثانية:

protected function expectResultPropertyChange(event: Event, numberOfEvents: int = 1): void {
    trace("Got event " + event + " on " + event.target + " with " + numberOfEvents + " traces left...");
    assertTrue(event.type == ResponseChangedEvent.RESPONSE_CHANGED);
    if (numberOfEvents > 1) {
        event.target.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, numberOfEvents - 1));
    }
}

public function testSomething(): void {
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, 2));
    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);
}
هل كانت مفيدة؟

المحلول

ردا على التعليق ...

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

.. في هذه الحالة لا تحتاج إلى استخدام وهمية أو addasync. شيء مثل هذا سوف تفعل:

public function testSomething(): void 
{
    var requiredQuestion : RequiredQuestion = new RequiredQuestion();

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);
}

نصائح أخرى

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

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

public class RequiredQuestion extends EventDispatcher
{
    private var someAsynchronousObject : IAsynchronousObject;

    public function RequiredQuestion(someAsynchronousObject : IAsynchronousObject = null)
    {
        someAsynchronousObject = someAsynchronousObject || new AsynchronousObject();
        someAsynchronousObject.addEventListener(Event.COMPLETE, asyncCallComplete);
    }

    public function responseSelected(id : String, flag : Boolean) : void
    {
        //Will asynchronously fire the Event.COMPLETE event
        someAsynchronousObject.startAsynchrounsCall(); 
    }

    protected function asyncCallComplete(event : Event) : void
    {
        dispatchEvent(new ResponseChangedEvent(ResponseChangedEvent.RESPONSE_CHANGED));
    }
}

لذلك افتراضيا، تستخدم الطبقة الملموسة التي تريد استخدامها ما لم يتم حقن SomeSynchronousobjec في الفصل عبر المنشئ. ربما يكون لدى ASYCNHRONOUSOBJEDJECTION أنها اختبارات الوحدة الخاصة أو أنها في فصل خارجي، لذلك لا تريد حقا، أو تحتاج إلى اختبار وظائفها. ما يمكنك القيام به الآن هو إنشاء كائن وهمية ينفذ IAsynchronousObject التي يمكن استخدامها لتزوير سلوكها. باستخدام إطار ASMOCK، قد يبدو الاختبار شيئا مثل هذا:

public function testSomething(): void 
{
    var mockIAsycnhronousObject :  IAsynchronousObject =
        IAsynchronousObject(mockRepository.createStrict( IAsynchronousObject));

    SetupResult.forEventDispatcher(mockIAsycnhronousObject);
    SetupResult.forCall(mockIAsycnhronousObject.startAsynchronousCall())
        .dispatchEvent(new Event(Event.COMPLETE)); // all calls to the startAsynchronousCall method and dispatch the complete event everytime it's called.

    mockRepository.replayAll();

    var requiredQuestion : RequiredQuestion = new RequiredQuestion(mockIAsycnhronousObject);

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);

    mockRepository.verifyAll();
}

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

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

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