PHP 单元测试类,用于加载另一个类



我有以下情况

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 服务是否正常工作,并且设置这些类型的测试并不像单元测试那样容易。

相关内容

最新更新