Это хорошая идея использовать те же константы в модульном тесте, которые используются в тестируемой системе? - PullRequest
1 голос
/ 20 февраля 2020

Представьте себе следующий метод:

GetEntity => new { Name = Constants.EntityName };

Теперь у меня будет модульный тест, чтобы проверить, что мой код возвращает правильную сущность:

var result = GetEntity();
Assert.Equal(Constants.EntityName, result.Name);

Или

var result = GetEntity();
Assert.Equal("ConstantEntityNameValue", result.Name);

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

Мне интересно, стоит ли жестко закодировать все значения или это достаточно хорошо, чтобы использовать константы.

PS Это бесполезные голые примеры, просто чтобы проиллюстрировать идею

1 Ответ

1 голос
/ 21 февраля 2020

Задайте себе следующий вопрос: Как бы вы документировали свою функцию для пользователя?

A) Предположим, что ваша документация идет в следующем направлении:

"GetEntity будет создайте новый объект с содержимым по умолчанию. Name будет присвоено содержимое Constants.EntityName, что означает, что позже в коде вы можете проверить, имеет ли Name значение по умолчанию, сравнив его с Constants.EntityName. "

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

B) Предположим, что вы бы задокументировали свою функцию следующим образом:

" GetEntity создаст новую сущность с содержимым по умолчанию. Name будет предоставлено содержимое Constants.EntityName, что составляет 'ConstantEntityNameValue'. [...] ".

В этом случае Я рекомендую иметь как минимум два тестовых случая: одно тестирование, чтобы атрибут Name равнялся Constants.EntityName, и второе тестирование, чтобы проверить, что Constants.EntityName равно 'ConstantEntityNameValue'. Причина: литерал является частью спецификации, поэтому клиентский код может его использовать. Однако в документации есть различие: для чего задокументирована функция (создание объекта с использованием Constants.EntityName) и значение константы.

C) Наконец, предположим, что ваша функция задокументировано следующее:

"GetEntity создаст новый объект с содержимым по умолчанию. Name будет присвоено значение 'ConstantEntityNameValue'. [...]".

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

...