Как протестировать данный класс php?

181
03 апреля 2018, 00:51
   <?php <br>
<br>
    namespace app\models;<br>
<br>
    use app\models\relations\Categories;<br>
<br>
    class MenuSite {<br>
<br>
    //отправление дерева категорий пользователю<br>
    public function getMenu() {<br>
        $categoriesList = $this->categoriesList();<br>
        $treeCategories = $this- 
       >buildingTreeOfCategories($categoriesList);
<br>
    return $treeCategories;<br>
}<br>
<br>
//получение списка категорий посредством SQL запроса<br>
private function categoriesList() {<br>
    return $categoriesList = Categories::find()<br>
->indexBy('id')<br>
->asArray()<br>
->all();<br>
}<br>
<br>
//формирование дерева с неограниченной вложенностью категорий<br>
private function buildingTreeOfCategories($categoriesList) {<br>
        $treeCategories = [];<br>
        foreach($categoriesList as $id => &$category) {<br>
    if ($category['id_parent'] === '0') {<br>
            $treeCategories[$id] = &$category;<br>
    }<br>
            $categoriesList[$category['id_parent']] ['subcategories']
                    [$category['id']] = &$category;<br>
   }<br>
      return $treeCategories;<br>
   }<br>
 }<br>
<br>

Добрый день. Меня интересует вопрос касательно того, каким образом правильно протестировать дынный класс.

SQL запрос реализован в отдельном приватном методе categoryList, а собственно его и хочется замокать, но при этом не хочу нарушать инкапсуляцию класса посредством модификатора public, ведь приватные методы не мокаются.

Есть ли какая-то возможность замокать сам класс Categories так, чтобы весь класс MenuSite, при обращении к данному классу Categories обращался к моку, а не к классу Categories непосредственно?

Или для адекватного теста мне все равно придется сделать метод categoryList публичным?

Answer 1

Можно использовать магический метод __call(). Он вызовется, когда будет попытка обращения к недоступному методу, и можно самостоятельно построить дальнейший сценарий. Пример:

public function __call($name, $arguments) {
  if ($name === 'categoriesListTest') {
    return $this->categoriesList();
  }
}
Answer 2

Для начала убери html теги из кода php (или тупой редактор от stackoverflow снгшный тебе так отредактировал что код стал в таком виде) Который раз, уже вижу - эти редакторы, модераторы входят, изменяют вопрос и все портят) Пока не уберешь brы интерпретатор не зачитает твою программу. А обратиться к классу и использовать его методы с функциями можно вот так $object = new Class;

READ ALSO
Создание события в истории Битрикс24

Создание события в истории Битрикс24

Можно ли из вебхука записывать историю в лиде или сделке, при их изменении и если да то каким образом(хотя бы ссылочку на api)

138
RedBeanPHP использовать внутри класса

RedBeanPHP использовать внутри класса

По видеогайду делаю структуру MVC и хочу использовать RedBeanPHP внутри классов , только вот не знаю как подключитьСтандартное подключение

136
Возвращение не той ссылки в PHP

Возвращение не той ссылки в PHP

Помогите пожалуйста , у меня в коде есть строка

155