(Эта статья является переведенной копией моей старой статьи в моем японском блоге. -› 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() может исправлять только функции, поэтому мне также нужен был способ исправления переменных и констант.

Переменные и постоянные патчи

Это два метода, которые я действительно использовал

  1. Поместить в env
    В реальном коде вызовите сохраненную константу с помощью os.GetEnv("FOO"). Измените env для каждой среды.
    При тестировании используйте os.SetEnv("FOO"), чтобы перезаписать его в тестовом файле.
  2. Подготовьте файл конфигурации и перезапишите его
    Определите константы в файле конфигурации. Однако объявите их как var.
    При тестировании загрузите файл конфигурации для тестирования. Это не очень красиво…

Файл конфигурации

package config
var (
    Hoge = "foobar"
)

Тест

config.Hoge = "barfoo"

Насмехаться

Вам нужен интерфейс для издевательства. Тот факт, что вам нужно создать макет даже для тестирования небольшой функции, доставляет неудобства людям, привыкшим к другим языкам.
Если у вас уже есть интерфейс (или вы хотите создать его для этой цели), mockry или gomock.
Используя их, вы можете легко создавать макеты.





Мое впечатление

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