0

私はFlex 3.3を使用しています.hamcrest-as3を使用して、ユニットテストの一部としてリスト内のアイテムメンバーシップをテストしています:

var myList: IList = new ArrayCollection(['a', 'b', 'c']).list;
assertThat(myList, hasItems('a', 'b', 'c'));

問題は、明らかにクラスが反復IListをサポートしていないことです。for eachたとえば、上記のリストでは、何もトレースされません。

for each (var i: * in myList) { trace (i); }

ただし、ArrayまたはArrayCollection同じデータを含む をトレースすることは問題なく機能します。

私がやりたいことは、(既存の に基づいたインターフェースを分解することなく)テストのために をまたは のようIListに扱うことができるようにすることです。IListArrayArrayCollection

override public function matches(collection:Object):Boolean
{
    for each (var item:Object in collection)
    {
        if (_elementMatcher.matches(item))
        {
            return true;
        }
    }

    return false;
}

これは単に失敗する運命にあるのでしょうか? 補足として、IList インターフェイスがこのように反復できないのはなぜでしょうか? それは間違っているようです。

4

3 に答える 3

1

Matcherを反復処理できるカスタムを作成する必要がありIListます。より具体的には、上記で参照したmatchesメソッドを拡張してオーバーライドします(そして、との特定のバージョンもIsArrayContainingMatcher作成する必要があります)。少し苦痛ですが、おそらくそれはあなたにとって価値があります。IListhasItemhasItems

長期的には、hamcrest-as3(またはfork)で問題を報告し、Iteratorパターンを使用して配列の反復を抽象化することができます。次に、カスタムイテレータを提供するためのオプションのパラメータを使用して、一般的なタイプ(Proxy-subclasses、 )に対して適切なイテレータを自動的に選択できます。IList

于 2010-08-03T22:20:42.583 に答える
0

私は時々これに戻ってくることに気づきます。新しい Matcher を作成するよりも、IList で toArray() を呼び出して、結果の配列と照合するのが常に最も簡単な解決策であることがわかりました。

于 2011-02-24T04:12:43.323 に答える
0

主な問題: ArrayCollection.list を に渡す代わりにassertThat()、ArrayCollection 自体を渡します。ArrayCollection は IList を実装し、 で反復可能for eachです。

var myList:IList = new ArrayCollection(['a', 'b', 'c']);
assertThat(myList, hasItems('a', 'b', 'c'));

パート 2 への回答: ArrayCollection.list は、Proxy を拡張せず、反復処理に必要なメソッドを実装していない ArrayList のインスタンスですfor each。ArrayCollection は、Proxy を拡張して必要なメソッドを実装する ListCollectionView を拡張します。

HTH。

于 2010-07-21T13:25:42.910 に答える