我正在使用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
的界面)能够将IList
视为Array
或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接口不能以这种方式迭代?这似乎不对。
答案 0 :(得分:1)
您必须创建一个能够迭代Matcher
的自定义IList
。更具体地说,扩展并覆盖您在上面引用的IsArrayContainingMatcher
匹配方法(您可能还想创建IList
和hasItem
的{{1}}特定版本。有点痛苦,但也许值得你。
从长远来看,您可以使用hamcrest-as3(或fork)提出问题,以使用Iterator模式抽象数组迭代。然后可以为公共类型(hasItems
- 子类,Proxy
)自动选择正确的迭代器,可能还有一个可选参数来提供自定义迭代器。
答案 1 :(得分:0)
主要问题:不是将ArrayCollection.list传递给assertThat()
,而是传递ArrayCollection本身。 ArrayCollection实现IList,可以使用for each
进行迭代。
var myList:IList = new ArrayCollection(['a', 'b', 'c']);
assertThat(myList, hasItems('a', 'b', 'c'));
回答第二部分:ArrayCollection.list是ArrayList的一个实例,它不扩展Proxy,并且没有实现所需的方法以便与for each
进行迭代。 ArrayCollection扩展了ListCollectionView,它扩展了Proxy并实现了所需的方法。
HTH。
答案 2 :(得分:0)
我发现自己每隔一段时间就回到这里。我发现最简单的解决方案是在IList上调用toArray()并匹配生成的数组,而不是编写新的Matchers。