为了账号安全,请及时绑定邮箱和手机立即绑定

加载另一个类的 PHP Unittest 类

加载另一个类的 PHP Unittest 类

PHP
胡说叔叔 2022-07-16 10:21:08
我有以下情况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-Class 进行单元测试?角色类从 web 服务加载自身......存根或模拟不适合(我猜)因为要模拟的对象是Role并且我正在测试User-Class 在这里......欢迎任何想法/BR菲利普
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

在这种情况下,您正在让您的User班级负责加载角色。通常,这不是您User班级的责任。相反,您可以例如setRole(Role $role)在您的User类上定义一个函数,该函数接受一个 realRole或 fake/stub/mock/whatever Role,而不是用户 ID。然后在实际使用用户对象的函数/代码中完成角色的检索。

但是那么如何测试那个类呢?

在单元测试中,通常更容易不依赖像你的静态方法Role::load。相反,您可以使用非静态方法。然后,您可以编写一个扩展类,Role它会在测试期间执行您希望它执行的操作。然后你也可以写一些东西来检查你告诉它做的事情是否已经完成。

这就是为什么通常不鼓励使用许多静态方法的原因:因为很难测试(使用)它们。


查看完整回答
反对 回复 2022-07-16
?
LEATH

TA贡献1936条经验 获得超6个赞

您的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 服务加载角色,但在这种情况下,我会称之为集成测试,在这种情况下,你想检查你的 web 服务是否正常工作,并且设置这些类型的测试并不像它那样容易单元测试。


查看完整回答
反对 回复 2022-07-16
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信