我需要在 FlexUnit 中测试私有方法。是否有可能通过使用 describeType 的反射来做到这一点,或者 flexUnit 有一些内置设施?我不喜欢无法测试私有函数的人为限制,它大大降低了灵活性。是的,测试私有函数对我来说是一个很好的设计,所以请不要建议我重构我的代码。我不想为了单元测试而打破封装。
4 回答
我 99% 确定这是不可能的,我很想知道您为什么要这样做。
您应该根据给定的输入对给定类的输出进行单元测试,而不管类内部发生了什么。您真的希望允许某人能够更改实现细节,只要它不更改预期输出(由单元测试定义)。
如果您测试私有方法,则对类的任何更改都将与单元测试紧密耦合。如果有人想重新调整代码以提高可读性,或进行一些更新以提高性能,他们将不得不更新单元测试,即使该类仍按最初设计的方式运行。
我确信在某些极端情况下测试私有方法可能是有益的,但我希望在大多数情况下不需要它。您不必打破封装,只需测试您的方法调用是否提供正确的输出......无论代码在内部做什么。
只需创建一个名为“unitTest”的公共方法并在该方法中调用所有单元测试。当其中一个失败并从您的测试框架中调用它时引发错误:
try {
myobject.unitTest();
} catch (Exception e) {
//etc.
}
你不能describeType
为此使用。
[...]
注意:
describeType()
仅显示公共属性和方法,不会显示私有、包内部或自定义命名空间中的属性和方法。[...]
当测试私有方法的冲动无法抗拒时,我只需为该方法创建一个可测试的命名空间。
在文件中声明一个命名空间,如下所示:
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();
}
}
真的,虽然我认为这暗示你应该将你的功能分成一个单独的类。