在Flex,Actionscript中调用私有方法

时间:2010-05-15 14:46:10

标签: flex reflection actionscript flexunit

我需要在FlexUnit中测试私有方法。有没有可能通过使用describeType通过反射来做到这一点,或者flexUnit可能在设施中有一些构建?我不喜欢人为限制,我无法测试私有功能,它大大降低了灵活性。是的,我测试私有函数是一个很好的设计,所以请不要建议我重构我的代码。我不想为了单元测试而打破封装。

4 个答案:

答案 0 :(得分:6)

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

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

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

我确信有一些边缘情况,测试私有方法可能是有益的,但我希望在大多数情况下它只是不需要。您不必打破封装,只需测试您的方法调用是否提供正确的输出......无论代码在内部执行什么。

答案 1 :(得分:2)

只需创建一个名为“unitTest”的公共方法,并在该方法中调用所有单元测试。当其中一个失败并从您的测试框架中调用它时抛出错误:

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

答案 2 :(得分:1)

您无法使用describeType

来自Livedocs - flash.utils package

  

[...]

     

注意: describeType()仅显示公共属性和方法,并且不会显示   私有,包内部或自定义命名空间中的属性和方法。

     

[...]

答案 3 :(得分:0)

当测试私有方法的冲动是不可抗拒的时候,我只是为该方法创建一个可测试的命名空间。

在如下文件中声明命名空间:

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

然后,您可以将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();
    }
}

实际上,我认为这是一个提示,你应该将你的功能分成一个单独的类。