У меня есть класс с константой:
class LoremIpsum {
const VALUE = '123';
public function MethodThatUsesConstant() {
...
}
}
Когда я хочу провести модульное тестирование метода, использующего эту константу, следует ли мне использовать константу из реального класса или мне следует создать новую константу в тестовом классе с тем же значением, что и реальная константа?
Бывший:
class LoremIpsumTest {
const VALUE = '123';
public function testMethodThatUsesConstant() {
...
}
}
или же
class LoremIpsumTest
{
//this test uses the real constant
public function testMethodThatUsesTheRealConstant() {
/**$const = \Namespace\LoremIpsum::VALUE **/
}
}






Я бы посоветовал вам следовать принципу сухой и использовать только исходную константу, более того, у вас будет единственная точка истины.
Я бы использовал реальную константу для своих тестов, но это зависит от того, для чего вы используете константу. Ваши примеры не обеспечивают достаточного контекста для вашего конкретного случая использования.
Если вы используете значение константы в качестве возвращаемого идентификатора, я бы использовал настоящую константу в своих тестах. Когда я проверяю значение возврата, не имеет значения, какое фактическое значение имеет значение, а то, что это константа. Существование константы является частью открытого интерфейса класса и проверки того, что значение гарантирует, что оно действительно существует. Изменение этого значения не меняет поведения класса, поэтому тесты всегда должны проходить.
Если в вычислениях используется константа, я бы вообще не беспокоился об этом. В этом случае константа становится деталью реализации. В этом случае я бы хотел, чтобы мои тесты действительно вычисляли значения для заданного набора входных данных. Выполнение расчетов моим тестом может показаться мне удобным, но есть риск дублирования математической ошибки, поскольку вы, скорее всего, скопируете и вставите алгоритм. Поэтому в этих тестах я бы вообще не использовал константу.
Это зависит от того, что представляет эта константа. Если это бизнес-требование (например, «виджет должен отображать 20 строк на странице» и const ROWS_PER_PAGE = 20), вы не следует повторно используете эту константу в тесте. Изменение кода не должно изменять бизнес-требования (которые должны быть представлены тестами). Создание такой зависимости может сделать весь тест совершенно бессмысленным - я могу изменить ROWS_PER_PAGE на 10, и тест пройдет, даже если требования ясны, что на странице должно быть 20 строк.
И да, это не выглядит СУХОЙ, но в этом весь смысл тестов - вы создаете два разных представления одного и того же требования: код, который отображает 20 строк на странице, и тест, проверяющий наличие 20 строк на странице. Тесты дублируют код по дизайну, не стоит слишком беспокоиться о дублированных константах.