2010-05-15 80 views
1

我在FlexUnit中需要它来测试私有方法。有没有可能通过使用describeType进行反射来完成此操作,或者flexUnit是否有一些内置的工具?我不喜欢人为限制,我无法测试私人功能,它大大降低了灵活性。是的,对我来说测试私有函数是一个很好的设计,所以请不要建议我重构我的代码。为了单元测试我不想打破封装。在Flex中调用私有方法,Actionscript

回答

6

我99%肯定这是不可能的,我很想知道你为什么要这样做。

您应该基于给定的输入,对给定类的输出进行单元测试,而不管类内发生了什么。只要不改变预期的输出(由单元测试定义),您确实希望允许某人能够更改实现细节。

如果您测试私有方法,则对该类的任何更改都将与单元测试紧密结合。如果有人想重新编写代码以提高可读性,或者进行一些更新以提高性能,那么即使类仍然按照最初设计的那样运行,他们将不得不更新单元测试。

我敢肯定,有些情况下测试私有方法可能是有益的,但我希望在大多数情况下它只是不需要。你不必破坏封装,只是测试你的方法调用给出正确的输出......不管内部代码是什么。

1

您不能使用describeType

Livedocs - flash.utils package

[...]

注:describeType()只显示公共属性和方法,而不会显示 属性和方法私有,在包内部或在自定义名称空间中。

[...]

2

只需创建一个名为“单元测试”的公共方法,并调用该方法内的所有单元测试。抛出一个错误,当其中一个出现故障,并从你的测试框架称之为:

try { 
    myobject.unitTest(); 
} catch (Exception e) { 
    //etc. 
} 
0

当测试的私有方法的冲动是无法抗拒的我只创建一个可测试命名的方法。

在这样的文件中声明命名空间:

package be.xeno.namespaces 
{ 
    public namespace testable = "http://www.xeno.be/2015/testable"; 
} 

然后你就可以使用可测试为你想测试这样的方法自定义访问修饰符:

public class Thing1 
{ 
    use namespace testable; 

    public function Thing1() 
    { 
    } 

    testable function testMe() : void 
    { 

    } 
} 

你可以然后通过在测试中使用命名空间访问该修饰符:

public class Thing2 
{ 
    use namespace testable; 

    public function Thing2() 
    { 
     var otherThing : Thing1 = new Thing1(); 
     otherThing.testMe(); 
    } 
} 

真的,虽然我t这意味着你应该将你的功能分解成一个单独的类。