(Эта статья является переведенной копией моей старой статьи в моем японском блоге. -› https://komajou.hatenablog.jp/entry/2019/11/11/065758 )
О
У меня чертовски много времени, чтобы понять, как заменить значения при тестировании в Go.
Это заметки о том, как я на самом деле реализовал это в тестах.
Патчи функций
MonkeyPatch был единственным способом сделать это.
- Функция, которую я хочу протестировать
func Hoge(a string, b int) (string, error) { return "hoge", nil }
- Фактический тест
func TestHoge(t *testing.T) { monkey.Patch(Hoge, func(string, int) (string, error) { return "fuga", nil}) ~~test test test~~ }
Однако monkey.Patch() может исправлять только функции, поэтому мне также нужен был способ исправления переменных и констант.
Переменные и постоянные патчи
Это два метода, которые я действительно использовал
- Поместить в env
В реальном коде вызовите сохраненную константу с помощью os.GetEnv("FOO"). Измените env для каждой среды.
При тестировании используйте os.SetEnv("FOO"), чтобы перезаписать его в тестовом файле. - Подготовьте файл конфигурации и перезапишите его
Определите константы в файле конфигурации. Однако объявите их как var.
При тестировании загрузите файл конфигурации для тестирования. Это не очень красиво…
Файл конфигурации
package config var ( Hoge = "foobar" )
Тест
config.Hoge = "barfoo"
Насмехаться
Вам нужен интерфейс для издевательства. Тот факт, что вам нужно создать макет даже для тестирования небольшой функции, доставляет неудобства людям, привыкшим к другим языкам.
Если у вас уже есть интерфейс (или вы хотите создать его для этой цели), mockry или gomock.
Используя их, вы можете легко создавать макеты.
Мое впечатление
В языке Go, если ваша команда не предназначена для тестирования, вы сильно пострадаете при написании тестов.
Go бросает нам вызов этим навыкам. Мы должны всегда помнить об этом.