0

我在SkinnableComponentFlex 应用程序上使用 s,并且正在测试某些组件的行为。

我想测试invalidateSkinState()在自定义事件的组件内执行的调用。我试图听不同的事件,FlexEvent.STATE_CHANGE_COMPLETE但没有处理任何事情。文档没有说明这一点,或者我找不到在哪里......

换句话说,我想知道托管组件如何告知皮肤其状态已更改。

有没有人尝试进行此类测试并找到了解决方案?

我会接受任何解决方案,即使它不涉及事件,但我想保持测试代码现在的样子(即没有方法覆盖,没有第三个事件调度等)

4

1 回答 1

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

我把它贴在这里以防它可以帮助别人。尽管如此,这个解决方案仍然受到批评,欢迎任何更好的解决方案。

于 2013-04-03T01:37:06.883 回答