我在Flex应用程序上使用SkinnableComponent
,我正在测试某个组件的行为。
我想测试在自定义事件的组件中执行对invalidateSkinState()
的调用。
我试图听取FlexEvent.STATE_CHANGE_COMPLETE
之类的不同事件,但没有处理任何事情。文档没有说明这一点,或者我找不到...
换句话说,我想知道如何通过托管组件告知皮肤状态已发生变化。
是否有人尝试执行此类测试并找到了解决方案?
即使它不涉及事件,我也会接受任何解决方案,但我想保留现在测试的代码(即没有方法覆盖,没有第三次事件发送等)
答案 0 :(得分:0)
正如www.Flextras.com的评论所述,对invalidateSkinState()的调用不会触发任何事件。
布局管理器处理时,组件稍后可能会调度某些事件。
但是,我的问题是测试(单元测试)被测试组件对特定事件执行invalidateSkiState()
的调用,我不能等待这样的事件。此外,组件永远不会添加到舞台中,因此布局管理器永远不会处理它。
所以我提出了一个解决方案,涉及扩展测试的组件类以用于测试目的。这样我就不必修改测试代码了。
以下是我的测试用例类的示例:
package com.example.components
{
import org.flexunit.Assert;
public class ComponentTests
{
[Test]
public function testSkinStateIsInvalidatedOnCustomEvent():void
{
var component:ComponentForTests = new ComponentForTests();
var event:CustomEvent = new CustomEvent();
// Here we set up the event for the test
testedComponent.init();
testedComponent.isStateInvalidated = false;
testedComponent.handleCustomEvent(event);
Assert.assertTrue("Skin state should be invalidated",
testedComponent.isStateInvalidated);
}
}
}
import com.example.components.TestedComponent;
internal class ComponentForTests extends TestedComponent
{
internal var isStateInvalidated:Boolean = false;
override public function invalidateSkinState():void
{
isStateInvalidated = true;
super.invalidateSkinState();
}
}
我在这里发布,以防它可以帮助别人。尽管如此,这个解决方案仍然受到批评,欢迎任何更好的解决方案。