好吧,现在不要生气,我知道关于这个话题有几个问题,但我仍有一些疑问。
我认为我完全同意不测试私有函数,我认为这是合理的,但我如何测试设置私有变量的公共方法呢?
假设构造函数设置了一些私有变量,我想测试在调用构造函数后正确设置这些变量。这是一个有效的测试吗?如何在不添加公共getter的情况下检查私有变量的值?
我添加了一个不真实的场景示例,试图更清楚:
public class ClassToTest
{
private bool _isOn;
public void SwitchOn() { _isOn = true; }
public void SwitchOff(){ _isOn = false; }
public void update()
{
if (_isOn)
DoSomething();
}
private void DoSomething()
{
//this could also execute a function of an external dependency. But still the dependency could not have a public function to test if the behavior actually ran.
}
}
如果我无法测试_isOn值,如何测试SwitchOn和SwitchOff是否正常工作? (这是一个例子,它意味着我不会编写一个公共getter,并且函数不会返回值,因为它们不需要)
答案 0 :(得分:0)
测试应该使用Assemble / Activate / Assert模式:
test switch on {
x = new ClassToTest();
x.SwitchOn(); // <-- Assemble an on switch
EmptyMailQueue(); // <-- Assemble nothing in the Q
PossiblySendUserEmail(); // <-- Activate the feature
assert(mailQueue.count() == 1);
}
test switch on {
x = new ClassToTest();
x.SwitchOff();
EmptyMailQueue();
PossiblySendUserEmail();
assert(mailQueue.count() == 0); // <-- Assert switch is off so no mails sent
}
您断言您有切换的实际原因。测试交换机本身违反了规则“不要TDD getter和setter”。
答案 1 :(得分:-1)
您需要测试私有成员,因为他们可能有错误。
“私人”不是一个神奇的障碍,它只是一个建议生产代码客户不要直接调用该成员的惯例。
使用_underbar预先添加所有此类成员与使用硬件保护此类方法的C ++一样有用。
你的汽车发动机内部有插头,驾驶时不应该使用插头,只有当机修工检测时才会使用。软件应该是一样的。测试您的私人成员,并在需要时禁用私人。
...然而
对象的意思是暴露行为。如果您的私有变量设置正确,那么您的对象应该正常运行。您的测试应该请求此行为。
查找“测试驱动开发”(并开始使用昨天),然后查找“故意编程”。您的测试用例应该从请求该行为开始,而不应该担心实现细节。如果升级对象以使用不同的内部,则无需进行太多测试。
(不要向精灵或软件方法学家寻求建议,因为他们会说是和否!)