Ошибка или ожидаемое поведение для Async FlexUnit Test?

Я работал над тем, как обработать унаследованный тест flexunit, который начинает давать сбои на более быстрых сборках сервера. MyMockService не готовится до начала запуска модульного теста. Мы используем FlexUnit и Mockolate.

<failure 
    message="A proxy for com.something.somemock.service::MyMockService has not been prepared yet" 
    type="com.something.somemock.MyAsyncTest">ArgumentError: A proxy for com.something.somemock.service::MyMockService has not been prepared yet.
    //... (lots removed here)
</failure>

Используемый общий импорт:

import flash.events.Event;
import flexunit.framework.Assert;
import mockolate.nice;
import mockolate.prepare;
import mockolate.stub;
import mockolate.verify;
import org.flexunit.async.Async;
import flash.utils.Timer;
import flash.events.TimerEvent;

Вот заглушка кода. (Я думаю) важные части есть, поэтому вы понимаете суть.

public class MyAsyncTest
{

    [Before(async)]
    public function prepareMockObjects():void
    {
        Async.proceedOnEvent(this, prepare(MyMockService), Event.COMPLETE);
    }

    [Test(async)]
    public function testExecute():void
    {

        var service:MyMockService = nice(MyMockService);
        verify(service).method("runSomething").args(ArgumentBuilder).once();

    }
}

Проделав большую работу, изменив время ожидания и добавив методы сна (все бесполезно в борьбе с ошибкой), я ввел еще один тест в класс теста flexunit, который содержит только задержку. Я заказал тесты и обнаружил, что мой тест теперь проходит каждый раз. (это хорошо) Я просто очень не хочу ставить тест, чтобы получить трехсекундную задержку, необходимую для завершения подготовки.

Вот заглушка кода для визуальных элементов:

public class MyAsyncTest
{   
    protected function makeMeSleep(howLongMs:int):void
    {
        //timer code to sleep
    }

    [Before(async)]
    public function prepareMockObjects():void
    {
        Async.proceedOnEvent(this, prepare(MyMockService), Event.COMPLETE);
    }

    [Test(async, order=1)]
    public function delayTheNextTest():void
    {
        var hasPaused:Boolean = makeMeSleep(3000);
        Assert.assertTrue("This is a silly delay to allow the service to prepare", true);
    }

    [Test(async, order=2)]
    public function testExecute():void
    {
        var service:MyMockService = nice(MyMockService);
        verify(service).method("runSomething").args(ArgumentBuilder).once();        
    }
}

Я рад, что сейчас тест проходит как надо, но он чувствует себя грязным. Я всегда исходил из того, что блок [Test] не будет работать до тех пор, пока не закончится блок [Before], но в этом состоянии тестирования это не так. Я думаю, что один важный вывод для меня, ребята, заключался бы в том, что этот тест в плохом стиле готовит мой фиктивный сервис, и что может быть лучше, чтобы избежать добавления "сна" теста просто для того, чтобы выиграть время? (плохой стиль сам по себе ИМХО)

спасибо за ваш вклад заранее.

1 ответ

Решение

Я столкнулся с похожими проблемами с Mockolate, и я, кажется, помню, как читал ответ Дрю, в котором говорилось, что он знает, что они существуют.

Я обнаружил, что правила надежны для асинхронных тестов, и их использование также делает код более читабельным. Просто объявите и MockolateRule, и требуемые фиктивные объекты как переменную-член (должна быть общедоступной для правильного выбора метаданных, и убедитесь, что экземпляр правила создан!), Затем используйте с mock() как бы вы nice() иначе.

[Rule]
public var myRule:MockolateRule = new MockolateRule();

[Mock]
public var myService:MyService;

[Before]
public function setUp():void {
    myService = mock(MyService);
}

[Test]
public function test():void {
    assertNotNull(myService);
}
Другие вопросы по тегам