2009-07-22 26 views
3

我在Flex应用程序中测试了一些事件调度代码,使用FlexUnit的addAsync方法来测试事件是否被调度。目前为止,我可以确保至少有一个事件被解雇。但是,我想要更详细一些;我希望确保我所期待的一系列事件得到调度。有没有一个有用的测试模式(或者,甚至是不同的测试框架 - 我很灵活!)来完成这个任务?Flex,Flexunit:如何测试事件分派两次?

我试过这个代码,但它似乎并没有被调用第二次:

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); 
} 
+0

你几乎可以肯定获得通过ASMock(http://asmock.sourceforge.net/)嘲笑无论是在制作的requiredQuestion来电asynchrous摆脱addAsync的。一旦你摆脱了addAsync,一切都将同步运行。如果还没有答案,会在明天上午(英国)提出。 J – 2009-07-22 20:22:37

回答

2

在回应评论...

如果有什么事件被直接发送 ? responseSelected不会 触发一个 组合对象上的异步事件,它只是直接发送 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); 
} 
2

这将是怎样一个类似的问题,可以使用来解决高层次例如嘲笑了无论是做异步调用的对象。显然我看不到你的代码,所以我不能给你一个确切的例子。

所以,正如我在评论中所说的,你可以模拟出一个类的依赖关系来伪造异步调用,以使它们变成同步的。采取下面的类

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

所以默认情况下,您使用的是您要使用,除非someAsynchronousObjec通过构造函数注入类的具体类。 AsycnhronousObject可能有它自己的单元测试,或者它在外部类中,所以你不需要,或者需要测试它的功能。你现在可以做的是创建一个模拟对象,实现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(); 
} 

这仅仅是一个多么嘲讽可以帮助你的单元测试的例子。尽管对于ActionScript(12月份发布)来说还是很新的,但嘲笑的内容还是非常丰富。 ASMock基于.net Rhino mocks,所以如果你需要帮助,寻找Rhino mock应该会产生更多的结果。

绝对是一种不同的思维方式,但一旦你进入它,你会想知道如何在没有它们的单元测试中得到。

+0

如果事件直接发送,该怎么办? responseSelected不会触发组合对象上的异步事件,它只是直接分派RESPONSE_CHANGED事件本身。我没有看到如何使用你的方法来嘲笑这种方法。请注意,我对模拟测试实践是模糊不清的,所以我可能在这里错过了一个简单的解决方案。 – 2009-07-23 15:37:49