1

AS3 でスタックを基本データ構造として使用するオブジェクト プールを作成しています (リンク リストで実装)。私は FlexUnit を初めて使用しますが、クラスの単体テストをいくつか行いたいと思っています (新しいプロジェクトでそれらをテストするのはせいぜい面倒なので)。

ただし、クラス メンバーが公開されていないため、変数を追跡しようとしていくつかの問題に遭遇しました。クラスのメンバーにのみ影響するプライベート メソッドをテストできるようにしたいと考えています。(例には、リストの作成、スタックからのノードのポップ、ノードのスタックへの押し戻しなどが含まれます。)

FlexUnit のプラクティスでは、クラスに対してテスト メソッドを実行する別のテスト クラスがあると述べているようです。ただし、これらのクラスはプライベート変数にアクセスできないため、単体テストのためだけにゲッターとセッターを作成する必要はありません。これを回避する方法はありますか?テスト ケース クラスではなく、Python スタイルのクラス自体にテスト メソッドを追加できますか?

これが以前に尋ねられた場合は申し訳ありません。私はこれが初めてです。私はあなたの助けに感謝します。コード スニペットなどで明確にする必要がある場合はお知らせください。

編集: 私のデータ構造は実際にはスタックであり、単なる一般的なリンク リストではないことに気付きました。これを反映するように質問を更新しました。

4

2 に答える 2

2

これが私が最新のユニットテストフレームワークで使用するトリックです。最新のフレームワークでは、TestCaseクラスまたはTestSuiteクラスを拡張する必要はありません。この基本的なことにより、公開されていないテストメソッドやクラスフィールドを処理する必要がある場合に、このような自由が得られます。

トリックは次のとおりです。

  1. これがテストする必要のあるクラスであると仮定しましょう。

    package com.npacemo.structures {
    
    class Stack 
    {
        public function push(item:Object):void 
        {
        }
    
        public function pop():Object 
        {
        }
    
        protected var top:Object;
    }
    }
    
  2. テストはスタックを継承できます。

    package com.npacemo.structures {
    
    class StackTest extends Stack 
    {    
        [Test] public function 
        should_push_the_item_on_top():void 
        {
            var item:Object = {name: "Item 01"};
            push(item);
            assertThat(top.name, equalsTo("Item 01"));
        }
    }
    }
    

    気に入らない場合は、-accessprotectedを使用することもできますがpackage、テストとテスト対象のクラスが同じパッケージに含まれていることを確認してください。

テストの目的でのみ、ゲッターとセッターのメソッド、およびパブリックフィールドとメソッドで抽象化がリークしないようにすることが重要です。一方、クラスの目的がデータ構造である場合、ゲッターとセッターは完全に理にかなっています。Robert C. Martinが、データ構造とオブジェクトの二分法について詳しく説明しています。

于 2011-11-01T16:15:32.570 に答える
1

リンクされたリストが少しでも役に立つなら、この情報へのアクセスを可能にするいくつかのものが公開されます。たとえば、私がここhttp://flexdiary.blogspot.com/2009/12/riadventure-inspiration.htmlに投稿した実装では、リスト自体は実際には公開されていません (リンクされたリストは主にそのノードだけであるため、より便利にするために、リンクを反復できるカーソルを分離しました)。

カーソルにはリストのエントリ ポイント ノードがあるため、必要に応じて、エントリ ポイントをチェックしてリストが作成されたことをテストできます。しかし、これはコンストラクターの引数として渡されるため、多くの人はそれを読み取り済みと見なし、テストを気にしません。

リンクが最後に追加されたことをテストするには、最後まで繰り返して、最後にあるノードが追加したノードであることを確認できます (リストが循環している場合を除きます。この場合、決定に苦労する可能性があります)。あなたが終わりに達したことを意味します)。ただし、リンクされたリストのポイントは、現在のポイントにリンクを追加することです (nextLink または前のリンクの任意のプロパティを新しいノードに設定し、古い nextLink の previousLink を新しいノードに設定することにより)。両方の方向にリンクされているため、Array を使用した方がよい場合に、まったく新しい構造を作成しようとしているために、この問題が発生している可能性があります。

私の実装を使用したい場合は、大歓迎です。TDD を始める前に書いたのでテストはありませんが、少なくとも 3 つのプロジェクトでなんらかの形で使用しています。

于 2011-11-01T14:13:47.440 に答える