Как я могу протестировать пул объектов связанного списка с помощью FlexUnit 4? - PullRequest
1 голос
/ 01 ноября 2011

Я создаю пул объектов в AS3, который использует стек в качестве базовой структуры данных (реализован с помощью связанного списка). Я новичок в FlexUnit, но я действительно хотел бы провести несколько модульных тестов для своих классов (так как тестирование их в новом проекте в лучшем случае было бы громоздким).

Я столкнулся с некоторыми проблемами, пытаясь отследить переменные, поскольку мои ученики не являются публичными; Я хочу иметь возможность тестировать свои личные методы, которые влияют только на членов класса. (Примеры включают создание списка, удаление узла из стека, перемещение узла обратно в стек и т. Д.)

Практики FlexUnit, похоже, утверждают, что у вас есть отдельный тестовый класс, который запускает тестовые методы для ваших классов. Однако эти классы не будут иметь доступа к моим личным переменным, и я не хочу создавать геттеры и сеттеры только для модульных тестов. Это можно обойти? Могут ли методы тестирования быть добавлены внутри самого класса в стиле Python вместо класса тестового примера?

Прошу прощения, если об этом уже спрашивали. Я новичок в этом; Я ценю вашу помощь. Дайте мне знать, если мне нужно уточнить с фрагментами кода или что-нибудь.

Edit: я понял, что моя структура данных на самом деле является стеком, а не просто общим связанным списком. Я обновил вопрос, чтобы отразить это.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Вот трюк, который я использую с современными системами модульного тестирования.В современных средах вам не нужно расширять класс TestCase или класс TestSuite.Эта базовая вещь дает вам такую ​​свободу, когда вам приходится иметь дело с методами тестирования или полями классов, которые не являются публичными.

Вот трюк:

  1. Предположим, это класс, который вам нужно проверить:

    package com.npacemo.structures {
    
    class Stack 
    {
        public function push(item:Object):void 
        {
        }
    
        public function pop():Object 
        {
        }
    
        protected var top:Object;
    }
    }
    
  2. Ваш тестможет наследовать стек:

    package com.npacemo.structures {
    
    class StackTest extends Stack 
    {    
        [Test] public function 
        should_push_the_item_on_top():void 
        {
            var item:Object = {name: "Item 01"};
            push(item);
            assertThat(top.name, equalsTo("Item 01"));
        }
    }
    }
    

    Если вам не нравится protected, вы также можете использовать package -access, но убедитесь, что тест и тестируемый класс находятся в одном пакете.

Важно не допустить утечки вашей абстракции с помощью методов получения и установки, а также открытого поля и методов исключительно для целей тестирования.С другой стороны, если целью вашего класса является структура данных, тогда методы получения и установки имеют смысл.Роберт К. Мартин подробно обсуждает дихотомию между структурами данных и объектами.

1 голос
/ 01 ноября 2011

Если ваш связанный список будет вообще полезен, он покажет некоторые вещи, которые предоставят вам доступ к этой информации. Например, в реализации, которую я разместил здесь http://flexdiary.blogspot.com/2009/12/riadventure-inspiration.html, сам список на самом деле не отображается (поскольку связанный список - это в основном только его узлы - поэтому, чтобы сделать его более полезным, я выделил курсор, который может перебрать ссылки).

У курсора есть узел точки входа для списка, поэтому, если вы хотите, вы можете проверить, что список был создан, проверив точку входа. Но он передается как аргумент конструктора, поэтому многие люди просто воспринимают его как прочитанное и не беспокоятся о тесте.

Чтобы проверить, что ссылка была добавлена ​​в конце, вы можете выполнить итерацию до конца и проверить, что узел, который находится в конце, является тем, который вы добавили (если ваш список не является циклическим, в этом случае у вас может быть трудно определить, что вы достигли конца). Однако смысл связанного списка состоит в том, что вы добавляете ссылки в той точке, где вы находитесь (путем установки nextLink или любого другого свойства предыдущей ссылки на новый узел - и previousLink старого nextLink на новый узел, если он связан в обоих направлениях), поэтому у вас может возникнуть эта проблема, потому что вы пытаетесь создать совершенно новую конструкцию, когда вам лучше использовать Array.

Обратите внимание, что если вы хотите использовать мою реализацию, добро пожаловать. Я написал его до того, как начал заниматься TDD, поэтому у него нет тестов, но я использовал его как минимум в трех проектах в той или иной форме.

...