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

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

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

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

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

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

2 ответа

Вот трюк, который я использую с современными системами модульного тестирования. В современных средах вам не нужно расширять класс 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-доступ, но убедитесь, что тест и тестируемый класс находятся в одном пакете.

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

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

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

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

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

Другие вопросы по тегам