<?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 публичным?
Можно использовать магический метод __call(). Он вызовется, когда будет попытка обращения к недоступному методу, и можно самостоятельно построить дальнейший сценарий. Пример:
public function __call($name, $arguments) {
if ($name === 'categoriesListTest') {
return $this->categoriesList();
}
}
Для начала убери html теги из кода php (или тупой редактор от stackoverflow снгшный тебе так отредактировал что код стал в таком виде) Который раз, уже вижу - эти редакторы, модераторы входят, изменяют вопрос и все портят) Пока не уберешь brы интерпретатор не зачитает твою программу. А обратиться к классу и использовать его методы с функциями можно вот так $object = new Class;
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости