我有以下情况
class User
{
private $id;
private $roleId;
private $role;
public function __construct(int $id, int $roleId)
{
$this->id = $id;
$this->setRoleId($roleId);
}
public function setRoleId(int $roleId)
{
$this->role = Role::load($roleId);
}
}
class Role
{
public function __construct($x, $y ,$z)
{
//...
}
static function load(int $id) : Role
{
// some magic code
return new Role($id);
}
public function getRoleId() : int
{
return $this->role->getId();
}
public function getRole() : Role
{
return $this->role;
}
}
我的问题是,如何对User
类进行单元测试? 角色类从 Web 服务加载自身...存根或模拟不适合(我猜(,因为要嘲笑的对象是Role
的,我正在这里测试User
类......
欢迎任何想法
/BR
菲 利 普
在本例中,您将User
类负责加载角色。通常,这不是您的User
班的责任。相反,例如,您可以在User
类上定义一个函数setRole(Role $role)
,该函数接受真实的Role
,或假/存根/模拟/任何Role
,而不是用户ID。然后,角色的检索在实际使用用户对象的函数/代码中完成。
但是,如何测试该类呢?
在单元测试中,通常更容易不依赖像Role::load
那样的静态方法。相反,您可以使用非静态方法。然后你可以编写一个扩展Role
的类,它做一些你希望它在测试期间做的事情。然后你也可以写一些东西来检查你告诉它做的事情是否已经完成。
这就是为什么通常不鼓励使用许多静态方法的原因:因为很难测试(使用(它们。
这里的User
类除了加载角色外,什么都不做。所以问题是你会在这门课上测试什么?
单元测试的目的是检查一种方法是否正常工作。这意味着如果对于定义的输入,它返回预期的结果,或者在输入无效时抛出错误。
如果您进行单元测试,存根或模拟类Role
是完全可以的。想象一下,您在User
类中有下一个方法(伪代码我在PHP中不太好(
public function getUserRights() : String[]
{
String[] array = new String[5];
if ($this->role.equals('ADMIN'){
.... some logic here ...
}
return array;
}
如果现在您存根您的角色并且在不同的测试中您从存根(模拟(对象返回不同的角色,您可以根据不同的角色检查您的方法getUserRights()
正常工作。
此外,从 Web 服务加载 Role 也是可以的,但在这种情况下,我会称之为集成测试,在这种情况下,您要检查您的 Web 服务是否正常工作,并且设置这些类型的测试并不像单元测试那样容易。