我需要在FlexUnit中测试私有方法。有没有可能通过使用describeType通过反射来做到这一点,或者flexUnit可能在设施中有一些构建?我不喜欢人为限制,我无法测试私有功能,它大大降低了灵活性。是的,我测试私有函数是一个很好的设计,所以请不要建议我重构我的代码。我不想为了单元测试而打破封装。
答案 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();
}
}
实际上,我认为这是一个提示,你应该将你的功能分成一个单独的类。