Apache flex 什么';使用hamcrest-AS3测试ILST成员资格的最佳方法是什么?

Apache flex 什么';使用hamcrest-AS3测试ILST成员资格的最佳方法是什么?,apache-flex,flex3,hamcrest,Apache Flex,Flex3,Hamcrest,我使用的是Flex 3.3,hamcrest-as3用于测试列表中的项目成员资格,作为单元测试的一部分: var myList: IList = new ArrayCollection(['a', 'b', 'c']).list; assertThat(myList, hasItems('a', 'b', 'c')); 问题是,IList类显然不支持每次迭代的;例如,对于上面的列表,这不会跟踪任何内容: for each (var i: * in myList) { trace (i); }

我使用的是Flex 3.3,hamcrest-as3用于测试列表中的项目成员资格,作为单元测试的一部分:

var myList: IList = new ArrayCollection(['a', 'b', 'c']).list;
assertThat(myList, hasItems('a', 'b', 'c'));
问题是,
IList
类显然不支持每次迭代的
;例如,对于上面的列表,这不会跟踪任何内容:

for each (var i: * in myList) { trace (i); }
但是,跟踪包含相同数据的
数组
数组集合
都可以正常工作

我想做的是(不必拆开我现有的基于
IList
的界面)能够将
IList
视为
数组
ArrayCollection
进行测试,因为hamcrest就是这样做的:

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

    return false;
}

这是注定要失败的吗?作为旁注,为什么IList接口不能以这种方式进行迭代?这似乎是错误的。

主要问题是:不要将ArrayCollection.list传递给
assertThat()
,而是传递ArrayCollection本身。ArrayCollection实现了IList,并且可以使用
对每个
进行编辑

var myList:IList = new ArrayCollection(['a', 'b', 'c']);
assertThat(myList, hasItems('a', 'b', 'c'));
作为对第二部分的回答:ArrayCollection.list是ArrayList的一个实例,它不扩展代理,也不实现对每个
使用
进行迭代所需的方法。ArrayCollection扩展了ListCollectionView,它扩展了代理并实现了所需的方法


HTH.

您必须创建一个自定义的
匹配器
,该匹配器能够在
IList
上迭代。更具体地说,扩展并覆盖上面引用的
IsArrayContainingMatcher
的matches方法(您可能还需要创建
IList
特定版本的
hasItem
hasItems
)。有点痛,但也许对你来说是值得的


从长远来看,您可以向hamcrest-as3(或fork)提交一个问题,以使用迭代器模式抽象数组迭代。然后,可以为常见类型(
Proxy
-子类,
IList
)自动选择正确的迭代器,可能还有一个可选参数来提供自定义迭代器。

我发现自己时不时会回到这个问题上来。我发现最简单的解决方案不是编写新的匹配器,而是在IList上调用toArray(),并与生成的数组进行匹配。

;我以ArrayCollection为例,但我有另一个正在测试的IList实现,而不是ArrayList。我正在特别寻找用IList实现这一点的方法。