2013-04-02 18 views
0

我正在使用Flex應用程序中的SkinnableComponent,我正在測試某個組件的行爲。Flex會在調用SkinnableComponent中的invalidateSkinState()時調度事件嗎?

我想以測試到invalidateSkinState()呼叫組件中的自定義事件進行。 我試圖聽FlexEvent.STATE_CHANGE_COMPLETE不同的事件,但沒有處理任何東西。該文件並沒有說這事,或者我找不到地方......

換句話說,我想知道皮膚是怎麼告訴其狀態已經由託管組件改變。

有誰試圖進行這樣的測試,並已找到了解決辦法?

我會接受任何解決方案,即使它不涉及事件,但我想保持測試的代碼,因爲它現在是(即沒有方法覆蓋,沒有第三事件調度等)

+0

無效方法不會觸發事件。所有無效方法所做的是排隊組件以改變狀態。它通過將布爾值從false更改爲true來實現;然後將該組件添加到layoutManager隊列中,以便在下一個呈現事件期間處理它。如果您想知道皮膚狀態更改何時完成,您可能需要監聽updateComplete.IF您只關注w /一個組件;你可以重寫invalidateSkinState()來分派一個事件。 – JeffryHouser

+0

我試圖在沒有更多成功的情況下偵聽'updateComplete'事件。正如我在我的問題中所述,我不想更改測試的代碼。無論如何,我通過在我的測試用例中重寫'invalidateSkinState()'來解決我的問題。而你的評論幫助我認爲我的問題不同,所以謝謝! – duTr

+0

聽取事件的問題在於,我的測試在我的自定義事件分派之後立即進行斷言(所以它由我的組件處理)。因爲它是單元測試,所以我不能等待'updateComplete'事件被調度。 – duTr

回答

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

我在這裏張貼的情況下,它可以幫助別人。儘管如此,這個解決方案仍然受到批評,任何更好的解決方案都是受歡迎的。