加载另一个类的 PHP Unittest 类

我有以下情况


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


菲利普


胡说叔叔
浏览 123回答 2
2回答

慕姐4208626

在这种情况下,您正在让您的User班级负责加载角色。通常,这不是您User班级的责任。相反,您可以例如setRole(Role $role)在您的User类上定义一个函数,该函数接受一个 realRole或 fake/stub/mock/whatever Role,而不是用户 ID。然后在实际使用用户对象的函数/代码中完成角色的检索。但是那么如何测试那个类呢?在单元测试中,通常更容易不依赖像你的静态方法Role::load。相反,您可以使用非静态方法。然后,您可以编写一个扩展类,Role它会在测试期间执行您希望它执行的操作。然后你也可以写一些东西来检查你告诉它做的事情是否已经完成。这就是为什么通常不鼓励使用许多静态方法的原因:因为很难测试(使用)它们。

LEATH

您的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 服务是否正常工作,并且设置这些类型的测试并不像它那样容易单元测试。
打开App,查看更多内容
随时随地看视频慕课网APP