异步FlexUnit测试的错误或预期行为?

时间:2013-07-11 16:20:02

标签: actionscript-3 unit-testing asynchronous flexunit4

我一直在研究如何处理在更快的服务器构建上开始失败的继承的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 个答案:

答案 0 :(得分:1)

我遇到了与Mockolate类似的问题,我似乎记得读过Drew的回答,提到他知道他们存在。

我发现规则对于异步测试是可靠的,并且使用它们也使代码更具可读性。只需将MockolateRule和所需的模拟对象声明为成员变量(必须公开才能正确拾取元数据,并确保实例化规则!),然后像mock()一样使用nice() 1}}否则。

[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);
}