1

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

4

4 回答 4

6

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

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

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

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

于 2010-05-15T15:08:16.007 回答
2

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

try {
   myobject.unitTest();
} catch (Exception e) {
   //etc.
}
于 2010-06-21T17:54:25.147 回答
1

你不能describeType为此使用。

来自Livedocs - flash.utils 包

[...]

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

[...]

于 2010-05-16T07:36:50.623 回答
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();
    }
}

真的,虽然我认为这暗示你应该将你的功能分成一个单独的类。

于 2011-05-07T02:45:34.320 回答