2017-02-02 21 views
0

После фундаментальных изменений в архитектуре моей проектной системы я оказался в ситуации, когда мне нужно было создать «fake», чтобы протестировать некоторые функции, которые использовались для быть открытым, как следующее:Единичный тест: использование правильной терминологии для издевательств/stubbing

/** 
* 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; 
} 

Хотя я читал несколько статей, это еще совсем неясно, на моем взгляде, если эти поддельные классы следует рассматривать как «заглушки» или «макет» (или даже "поддельных "," манекен "и так далее).

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

Как вы назвали бы эту поддельную реализацию класса, созданную исключительно для целей тестирования, чтобы быть понятным?

ответ

2

Жерар Мезарос объясняет терминологию манекенов, шлемов, шпионов, издевок и подделок here.

Примеры из мира PHP here.

+0

Спасибо, Себастьян. Поскольку я расширяю 'PageController', чтобы переопределить защищенный метод и вводить данные, это должно было бы быть обманом. Учитывая, что наше основное программное обеспечение (100% развитое в Канаде) не имеет единого модульного теста, я должен, вероятно, придерживаться единственного наименования, для простоты, когда я опорочу свои ожидания от разработчиков марокканцев. босс нанял ... –