如何使用FlexUnit 4测试链接列表对象池?

时间:2011-11-01 13:28:49

标签: flash actionscript-3 unit-testing flexunit4

我在AS3中创建一个对象池,它使用堆栈作为其基本数据结构(使用链表实现)。我是FlexUnit的新手,但我真的很想为我的课程进行一些单元测试(因为在一个新项目中测试它们最好是麻烦的。)

但是,我遇到了一些试图跟踪变量的问题,因为我的班级成员不公开;我希望能够测试仅影响类成员的私有方法。 (示例包括创建列表,从堆栈弹出节点,将节点推回堆栈等)。

FlexUnit的做法似乎表明您有一个单独的测试类,它针对您的类运行测试方法。但是,这些类将无法访问我的私有变量,并且我不想仅为单元测试创​​建getter和setter。有没有解决的办法?可以在类本身内部添加测试方法,而不是在测试用例类中添加测试方法吗?

如果之前有人问过,我道歉。我是新来的;我感谢您的帮助。如果我需要使用代码段或其他任何内容澄清,请告诉我。

编辑:我意识到我的数据结构实际上是一个堆栈,而不仅仅是一个通用的链表。我已经更新了这个问题以反映这一点。

2 个答案:

答案 0 :(得分: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. 您的测试可以继承Stack:

    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 - 访问权限,但要确保测试和被测试的课程在同一个包中。

  3. 重要的是不允许使用getter和setter方法以及公共字段和方法泄露您的抽象,仅用于测试目的。另一方面,如果你的课程的目的是成为一个数据结构,那么getter和setter就非常有意义。 Robert C. Martin详细讨论了数据结构和对象之间的二分法。

答案 1 :(得分:1)

如果您的链接列表非常有用,它会显示一些可以让您访问此信息的内容。例如,在我在这里发布http://flexdiary.blogspot.com/2009/12/riadventure-inspiration.html的实现中,列表本身并没有真正暴露(因为链表主要只是它的节点 - 所以为了使它更有用,我分离出一个可以迭代的游标通过链接)。

光标有一个列表的入口点节点,因此如果您需要,可以通过检查入口点来测试是否已创建列表。但它是作为构造函数参数传递的,所以很多人只会将其视为读取而不需要考虑测试。

要测试最后是否添加了链接,您可以迭代到最后并检查末尾的节点是否是您添加的节点(除非您的列表是循环的,在这种情况下您可能有一个很难确定你已经到了最后)。但是,链接列表的要点是您在您所在的位置添加链接(通过将nextLink或前一个链接的任何属性设置为新节点 - 以及旧的nextLink的previousLink到新节点,如果它是两个方向链接),所以你可能遇到这个问题,因为当你最好只使用数组时,你正试图创建一个全新的构造。

请注意,如果您想使用我的实现,欢迎您使用。我在开始做TDD之前写过它,所以它没有测试,但我现在已经以某种形式在至少3个项目中使用它了。