假设我有一个执行某种计算的私人例行:如何在不重构的情况下对私有代码进行单元测试来分离类?
private function TCar.Speed: float
{
Result = m_furlogs * 23;
}
但现在我要开始更彻底地测试这个计算,所以我重构它到一个单独的函数:
public function TCar.Speed: float
{
Result = CalculateSpeed(m_furlogs);
}
private function TCar.CalculateSpeed(single furlogs): float
{
Result = furlogs * 23;
}
现在我可以CalculateSpeed
进行各种测试:
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
除了我不能执行这些测试,因为CalculateSpeed
对TCar
是私有的。抽象的单元测试tennant是你永远不会测试私有代码 - 只有公共接口。作为一个实际问题,* x * Unit通常不能访问正在测试的独立类的私有方法。
问题是,没有其余的类被设置为处理单元测试。这是第一个有任何测试的例程。而且配置主机类是一套初始条件非常困难,这将允许我用每一组我想要的输入来测试调用CalculateSpeed
。
唯一的选择,我可以看到,被搬进搬出这个私人计算到它自己的TCarCalculateSpeed
类:
public class TCarCalculateSpeed
{
public function CalculateSpeed(float furlogs)
{
Result = furlogs * 23;
}
}
全班,致力于揭露一个方法,那应该是私人的,只是这样我就可以测试它?
类爆炸。
加上它是私人的。如果我想让它公开,我宁愿将它推广到公开知名度 - 至少这样我保存一个单独的课程正在创建。
我想添加一些单元测试;但随着代码的变化,它只能以小块完成。我不能完全重新设计运行12年的软件,可能会破坏一切,因为我想测试一个内部计算。
我现在的,最好的,思维是一个Test
方法添加到我的Car
类,只是调用:
TCar Car = new TCar();
Car.RunTests;
public procedure TCar.RunTests
{
Check(CalculateSpeed(0) = 0);
Check(CalculateSpeed(1) = 23);
Check(CalculateSpeed(2) = 46);
Check(CalculateSpeed(88) = -1);
}
但现在我必须弄清楚如何有TCar.RunTests
得到由外部TestRunner
触发,它只被设计为使用TestCase
类。
注:我已经尝试过我最深入的混合一堆语言的语法。换句话说:语言是不可知的。
我不知道如何以语言不可知的方式来完成它,但在VS/.NET中,它将创建一个Accessor类,它会影响您的真实课程并将所有内容公开化,以便您可以对其进行测试。 – CaffGeek 2010-09-29 21:36:28
这可能是我可以得到的答案。我必须使方法'protected',而不是'private',但然后我可以从我的单元测试代码文件访问受保护的成员。 – 2010-10-01 21:04:25