Apache flex 什么';使用hamcrest-AS3测试ILST成员资格的最佳方法是什么?
我使用的是Flex 3.3,hamcrest-as3用于测试列表中的项目成员资格,作为单元测试的一部分: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); }
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实现这一点的方法。