2008-08-29 6 views
1

我々は仕事でここに約6ヶ月間のFlexを使用してきた、と私はカスタムコンポーネントを含むFlexUnitテストの私の最初のバッチは、パターンのこの種を追跡する傾向があることがわかった:FlexUnitコンポーネントのテストパターン:addAsyncを使用するか手動で初期化しますか?

import mx.core.Application; 
import mx.events.FlexEvent; 
import flexunit.framework.TestCase; 

public class CustomComponentTest extends TestCase { 
    private var component:CustomComponent; 

    public function testSomeAspect() : void { 
     component = new CustomComponent(); 
     // set some properties... 

     component.addEventListener(FlexEvent.CREATION_COMPLETE, 
      addAsync(verifySomeAspect, 5000)); 

     component.height = 0; 
     component.width = 0; 
     Application.application.addChild(component); 
    } 

    public function verifySomeAspect(event:FlexEvent) : void { 
     // Assert some things about component... 
    } 

    override public function tearDown() : void { 
     try { 
      if (component) { 
       Application.application.removeChild(component); 
       component = null; 
      } 
     } catch (e:Error) { 
      // ok to ignore 
     } 
    } 

は基本的に、あなたがする必要がありますコンポーネントが完全に初期化されていることを確認してから、何かを確実に確認してください。Flexでは、これが表示リストに追加された後に非同期的に発生します。そのため、コールバックをセットアップする必要があります(FlexUnitのaddAsync関数を使用)。

最近、私はちょうど手動でランタイムが必要な場所であなたのために呼び出しますメソッドを呼び出してきたので、今、私のテストをより次のように見える傾向:

import flexunit.framework.TestCase; 

    public class CustomComponentTest extends TestCase { 

     public function testSomeAspect() : void { 
      var component:CustomComponent = new CustomComponent(); 
      component.initialize(); 
      // set some properties... 
      component.validateProperties(); 

      // Assert some things about component... 
     } 

これは従うことがはるかに簡単ですしかし、ちょっと私はちょっと騙されているように感じます。最初のケースは、現在のアプリケーション(これは単体テストランナーシェルアプリケーション)にスラミングしており、後者は「本当の」環境ではありません。

このような状況に他の人がどのように対処するのだろうと思いましたか?

答えて

1

非同期バージョンの使用には何も問題ありません。私は、第2版が短いことに同意することができますが、私はそれが続く方が簡単だとは確信していません。このテストでは、通常はやりたくないことがたくさんありますが、最初の例は、テスト環境外でコンポーネントを使用する方法にもっと当てはまります。

また、2番目の形式では、フレームワークの機能を確実に実行し、1つのステップを逃してテストが適切でないことを確認し、各テストでこのコードを繰り返す必要があります。私には、可能な限り実物に近い状況でテストするほうがよいと思われます。

public function testLogin():void { 
    var passThroughData:Object = new Object(); 

    passThroughData.username = "myuser1"; 
    passThroughData.password = "somepsswd"; 

    var sequence:SequenceRunner = new SequenceRunner(this); 

    sequence.addStep(new SequenceSetter(form.usernameTI, {text:passThroughData.username})); 
    sequence.addStep(new SequenceWaiter(form.usernameTI, FlexEvent.VALUE_COMMIT, 100)); 

    sequence.addStep(new SequenceSetter(form.passwordTI, {text:passThroughData.password})); 
    sequence.addStep(new SequenceWaiter(form.passwordTI, FlexEvent.VALUE_COMMIT, 100)); 

    sequence.addStep(new SequenceEventDispatcher(form.loginBtn, new MouseEvent("click", true, false))); 
    sequence.addStep(new SequenceWaiter(form, "loginRequested", 100)); 

    sequence.addAssertHandler(handleLoginEvent, passThroughData); 

    sequence.run(); 
} 

(例see here for more infodpUintウィキから):

あなたはdpUintsequencesを見ている可能性があり、彼らは少しより宣言テストコンポーネントました。

関連する問題