1

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

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

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

如果以前有人问过这个问题,我很抱歉。我是新手;我感谢您的帮助。让我知道我是否需要用代码片段或任何东西来澄清。

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

4

2 回答 2

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-access,但要确保测试和被测类在同一个包中。

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

于 2011-11-01T16:15:32.570 回答
1

如果您的链接列表完全有用,它将公开一些可以让您访问此信息的内容。例如,在我在这里发布的实现http://flexdiary.blogspot.com/2009/12/riadventure-inspiration.html中,列表本身并没有真正暴露(因为链表主要只是它的节点——所以为了使它更有用,我分离出一个可以遍历链接的光标)。

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

要测试是否在末尾添加了链接,您可以迭代到末尾并检查末尾的节点是否是您添加的节点(除非您的列表是循环的,在这种情况下您可能很难确定你已经走到了尽头)。但是,链表的要点是您在您所在的位置添加链接(通过将 nextLink 或上一个链接的任何属性设置到新节点 - 如果旧的 nextLink 的 previousLink 到新节点是双向链接的),所以你可能会遇到这个问题,因为你试图创建一个全新的结构,而你最好只使用 Array.

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

于 2011-11-01T14:13:47.440 回答