我在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);
}
为响应评论...
如果该事件被直接发送? responseSelected不复合对象上触发异步事件时,它简单地直接分派的RESPONSE_CHANGED事件本身。 我没有看到这种方法如何可以用你的方法被嘲笑。 你要知道,我在模拟测试实践模糊原样,所以我可能在这里失去了一个简单的解决方案。
..in这种情况下,你不需要使用模拟或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));
}
}
所以,在默认情况下,你使用的是您要使用,除非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();
}
这是多么讽刺能帮助你的单元测试的只是一个例子。 有信息的全部财富在那里的嘲讽,虽然它仍然是非常新的动作脚本(12月份发布)。 ASMock是基于.NET犀牛嘲笑因此搜索犀牛嘲笑,如果你需要帮助,应该抛出了很多成果。
当然不同的思维方式,但一旦你进入它你会想知道你是如何在单元测试通过了,没有他们。