我读过有些人测试过,有些人没有。你什么时候对getter / setter进行单元测试?
如果我想跳过单元测试getter和setter,我将如何使用PHPUnit管理它(跳过所有getter和setter)?
答案 0 :(得分:8)
测试包含业务逻辑的方法。 setter通常只是一个赋值,getter大多数时候只返回一个对象的属性,或者有时候是一个硬编码的常量。配对编程和代码审查期间的目视检查应该是这些方法所需的全部测试。
PHPUnit没有测试任何东西。它只是一个帮助您编写测试并运行它们的工具。您编写测试,您可以决定在每次测试中测试的方法。
如果你关于包含/排除方法的问题是关于代码覆盖的,那么,imho,你走错了路。代码覆盖本身并不是一个目标,它不会显示任何内容。拥有100%的代码覆盖率和成功的测试套件并不容易实际测试代码。
制定目标,编写描述代码行为的测试。不要使用setter来获取所需的对象属性;添加初始化对象所需的构造函数参数。仅将setter用于可选属性。根据需要使用较少的吸气剂。在其方法中封装特定于对象的行为,不要像使用数组一样使用对象(仅用于存储值)。
答案 1 :(得分:3)
这实际上取决于你在那些setter和getter中拥有的东西,但对我而言,即使它们像设置私有/受保护属性一样简单,测试它们也是有意义的。
在给定特定输入的情况下,您的程序具有预期/期望的行为,并且单元测试确保不会出现回归问题。
例如,给定一个带有具体setter / getter的类,你会想要复制粘贴一些方法,你可能会忘记更改其中一个setter中的属性名称,以2个不同的setter结束相同的值:
class User
{
private $firstName;
private $lastName;
public function setFirstName($value)
{
$this->firstName = $value;
}
public function getFirstName()
{
return $this->firstName;
}
public function setLastName($value)
{
$this->firstName = $value;
}
public function getLastName()
{
return $this->lastName;
}
}
你的测试可能类似
public function testSetLastName_validValue_successful()
{
$user = new User;
$value = 'Doe';
$user->setLastName($value);
$this->assertEquals($value, $user->getLastName());
}
这将立即显示setLastName
中的错误,这是TDD如何帮助的一个很好的例子:)
为每个setter / getter对编写一些非常简单的单元测试可以避免一些烦恼。
即使使用重载,单元测试也可用于确保魔术设定器/吸气剂的域。
至于“如何跳过所有的getter和setter”......只是不为它们编写测试?