正如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();
}
}
我在這裏張貼的情況下,它可以幫助別人。儘管如此,這個解決方案仍然受到批評,任何更好的解決方案都是受歡迎的。
無效方法不會觸發事件。所有無效方法所做的是排隊組件以改變狀態。它通過將布爾值從false更改爲true來實現;然後將該組件添加到layoutManager隊列中,以便在下一個呈現事件期間處理它。如果您想知道皮膚狀態更改何時完成,您可能需要監聽updateComplete.IF您只關注w /一個組件;你可以重寫invalidateSkinState()來分派一個事件。 – JeffryHouser
我試圖在沒有更多成功的情況下偵聽'updateComplete'事件。正如我在我的問題中所述,我不想更改測試的代碼。無論如何,我通過在我的測試用例中重寫'invalidateSkinState()'來解決我的問題。而你的評論幫助我認爲我的問題不同,所以謝謝! – duTr
聽取事件的問題在於,我的測試在我的自定義事件分派之後立即進行斷言(所以它由我的組件處理)。因爲它是單元測試,所以我不能等待'updateComplete'事件被調度。 – duTr