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); }

但是,跟踪包含相同数据的 anArray或 an可以正常工作。ArrayCollection

我想要做的是(不必拆开我现有IList的基于 - 的界面)能够处理IList类似 anArray或 anArrayCollection以进行测试,因为这就是 hamcrest 所做的:

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. 更具体地说,扩展和覆盖IsArrayContainingMatcher您在上面引用的matches 方法(您可能还想创建IList特定版本的hasItemand hasItems)。有点痛苦,但也许对你来说是值得的。

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

于 2010-08-03T22:20:42.583 回答
0

我发现自己每隔一段时间就会回到这个问题上。我发现最简单的解决方案是在 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'));

回答第二部分: ArrayCollection.list 是 ArrayList 的一个实例,它不扩展 Proxy 并且不实现所需的方法来迭代for each. ArrayCollection 扩展了 ListCollectionView,它扩展了 Proxy 并实现了所需的方法。

HTH。

于 2010-07-21T13:25:42.910 回答