Функции юнит-тестирования с побочными эффектами? - PullRequest
6 голосов
/ 28 августа 2010

Допустим, вы пишете функцию, чтобы проверить, была ли страница достигнута по соответствующему URL.У этой страницы есть «каноническая» заглушка - например, хотя страницу можно найти по адресу stackoverflow.com/questions/123, мы бы предпочли (по причинам SEO) перенаправить ее на stackoverflow.com/questions/123/how-do-i-move-the-turtle-in-logo - и фактическое перенаправление безопасно содержится в его собственном методе (например, redirectPage ($ url)), но как правильно протестировать функцию, которая вызывает его?

Например, возьмите следующую функцию:

function checkStub($questionId, $baseUrl, $stub) {
  canonicalStub = model->getStub($questionId);
  if ($stub != $canonicalStub) {
    redirectPage($baseUrl . $canonicalStub);
  }
}

Если бы вы проводили модульное тестирование функции checkStub (), не помешало бы перенаправление?

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

Я просто провалюсь при модульном тестировании?

Ответы [ 3 ]

2 голосов
/ 28 августа 2010

Вы говорите ...

Это часть более масштабной проблемы, когда некоторые функции кажутся слишком большими и покидают сферу модульного тестирования и попадают в мир интеграционного тестирования

Я думаю, именно поэтому модульное тестирование (1) сложно и (2) приводит к тому, что код не рушится под собственным весом.Вы должны тщательно разбираться со всеми вашими зависимостями, иначе вы получите модульные тесты == интеграционные тесты.

В вашем примере вы бы добавили перенаправитель в качестве зависимости.Вы используете макет, двойник или шпион.Затем вы делаете тесты, как выложил @atk.Иногда это того не стоит.Чаще это заставляет вас писать лучший код.И трудно обойтись без контейнера МОК.

1 голос
/ 03 февраля 2015

Это старый вопрос, но я думаю, что этот ответ актуален.@Rob заявляет, что вы бы добавили перенаправитель как зависимость - и, конечно, это работает.Однако ваша проблема заключается в том, что у вас нет хорошего разделения интересов.

Вам необходимо сделать свои функции как можно более атомарными, а затем составлять более широкие функциональные возможности с использованием созданных вами гранулярных функций.Вы написали это:

function checkStub($questionId, $baseUrl, $stub) {
  canonicalStub = model->getStub($questionId);
  if ($stub != $canonicalStub) {
    redirectPage($baseUrl . $canonicalStub);
  }
}

Я бы написал это:

  function checkStubEquality($stub1, $stub2) {
    return $stub1 == $stub2;
  }

  canonicalStub = model->getStub($questionId);
  if (!checkStubEquality(canonicalStub, $stub)) redirectPage($baseUrl . $canonicalStub);
0 голосов
/ 28 августа 2010

Похоже, у вас просто еще один тест. Вам нужно проверить, что заглушка правильно идентифицирована как заглушка, как с положительным, так и с отрицательным тестированием, и вам необходимо убедиться, что страница, на которую вы перенаправлены, верна.

Или я совершенно не правильно понял вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...