Какой лучший способ использовать hamcrest-AS3 для проверки членства в IList? - PullRequest
0 голосов
/ 02 июня 2010

Я использую 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 не может быть повторен таким образом? Это просто кажется неправильным.

Ответы [ 3 ]

1 голос
/ 04 августа 2010

Вам нужно будет создать пользовательский Matcher, способный перебирать IList. В частности, расширьте и переопределите метод совпадений IsArrayContainingMatcher, на который вы ссылаетесь выше (и вы, вероятно, захотите создать IList специальные версии hasItem и hasItems). Немного боли, но, возможно, оно того стоит.

В более долгосрочной перспективе вы можете подать проблему с помощью hamcrest-as3 (или fork), чтобы абстрагирование массива осуществлялось с использованием шаблона Iterator. Правильный итератор может быть выбран автоматически для общих типов (Proxy -подклассы, IList), возможно, с необязательным параметром для предоставления пользовательского итератора.

0 голосов
/ 24 февраля 2011

Я возвращаюсь к этому время от времени. Вместо того, чтобы писать новые Matchers, я считаю, что самое простое решение - просто вызвать toArray () для IList и сопоставить его с результирующим массивом.

0 голосов
/ 21 июля 2010

Для основной проблемы: вместо передачи 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 и реализует необходимые методы.

НТН.

...