После фундаментальных изменений в архитектуре системы моего проекта я попал в ситуацию, в которой мне нужно было бы создать «не настоящие«реализация для того, чтобы протестировать некоторые функции, которые раньше были общедоступными, например:
/**
* Display the template linked to the page.
*
* @param $newSmarty Smarty object to use to display the template.
*
* @param $parameters associative Array containing the values to pass to the template.
* The key is the name of the variable in the template and the value is the value of the variable.
*
* @param $account child class in the AccountManager hierarchy
*
* @param $partialview String name of the partial view we are working on
*/
protected function displayPageTemplateSmarty(Smarty &$newSmarty, array $parameters = array(), AccountManager $account = NULL, string $partialview = "")
{
$this->smarty = $newSmarty;
if (is_file(
realpath(dirname(__FILE__)) . "/../../" .
Session::getInstance()->getCurrentDomain() . "/view/" . (
!empty($partialview) ?
"partial_view/" . $partialview :
str_replace(
array(".html", "/"),
array(".tpl", ""),
Session::getInstance()->getActivePage()
)
)
)) {
$this->smarty->assign(
'activeLanguage',
Session::getInstance()->getActiveLanguage()
);
$this->smarty->assign('domain', Session::getInstance()->getCurrentDomain());
$this->smarty->assign(
'languages',
Languagecontroller::$supportedLanguages
);
$this->smarty->assign(
'title',
Languagecontroller::getFieldTranslation('PAGE_TITLE', '')
);
$this->smarty->assign_by_ref('PageController', $this);
$htmlTagBuilder = HTMLTagBuilder::getInstance();
$languageController = LanguageController::getInstance();
$this->smarty->assign_by_ref('htmlTagBuilder', $htmlTagBuilder);
$this->smarty->assign_by_ref('languageController', $languageController);
if (!is_null($account)) {
$this->smarty->assign_by_ref('userAccount', $account);
}
if (!is_null($this->menuGenerator)) {
$this->smarty->assign_by_ref('menuGenerator', $this->menuGenerator);
}
foreach ($parameters as $key => $value) {
$this->smarty->assign($key, $value);
}
$this->smarty->display((!empty($partialview) ?
"partial_view/" . $partialview :
str_replace(
array(".html", "/"),
array(".tpl", ""),
Session::getInstance()->getActivePage()
)
));
}
}
В этом случае PageController
Класс раньше вызывался непосредственно в контроллерах, но теперь это абстрактный класс, расширенный контроллерами, и мои модульные тесты больше не могут получить доступ к методу.
У меня также есть методы, подобные этому, в моем новом классе обертки сессий, которые могут использоваться только в очень специфическом контексте и для которых мне действительно нужно создать реализацию поддельной страницы, чтобы проверить их.
/**
* Add or update an entry to the page session array.
*
* Note: can only be updated by the PageController.
*
* @param $key String Key in the session array.
* Will not be added if the key is not a string.
*
* @param $value The value to be added to the session array.
*
* @return Boolean
*/
public function updatePageSession(string $key, $value)
{
$trace = debug_backtrace();
$updated = false;
if (isset($trace[1]) and
isset($trace[1]['class']) and
$trace[1]['class'] === 'PageController'
) {
$this->pageSession[$key] = $value;
$updated = true;
}
return $updated;
}
Несмотря на то, что я прочитал несколько статей, мне все еще неясно, следует ли считать эти фальшивые уроки «огрызок«или»издеваться» (или даже «не настоящие«,»фиктивный» и так далее).
Мне действительно нужно использовать правильную терминологию, так как мой начальник ожидает, что я (в ближайшем будущем) передам большую часть моей рабочей нагрузки зарубежным разработчикам.
Как бы вы назвали эти ложные реализации классов, созданные исключительно для целей тестирования, чтобы быть понятными?
Джерард Месарос объясняет терминологию манекенов, пней, шпионов, издевательств и подделок Вот.
Вы можете найти примеры из мира PHP Вот.
Других решений пока нет …