使用hamcrest-AS3测试IList成员资格的最佳方法是什么?

时间:2010-06-01 21:00:22

标签: 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迭代;例如,使用上面的列表,这不会跟踪任何内容:

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

但是,跟踪包含相同数据的ArrayArrayCollection将会正常工作。

我想要做的是(无需拆除我现有的基于IList的界面)能够将IList视为ArrayArrayCollection为了测试的目的,因为这就是hamcrest所做的:

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

    return false;
}

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

3 个答案:

答案 0 :(得分:1)

您必须创建一个能够迭代Matcher的自定义IList。更具体地说,扩展并覆盖您在上面引用的IsArrayContainingMatcher匹配方法(您可能还想创建IListhasItem的{​​{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。