亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

加載另一個類的 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條經驗 獲得超7個贊

您的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 關注
  • 138 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號