Monkey patching в Golang

Наткнулся на очень интересную библиотеку, позволяющую переопределять функции и методы у объектов для написания юнит тестов перед компиляцией. В PHP, Ruby или Python это делается довольно просто парой строк. Т.к го все же язык компилируемый и со строгой типизацией тут нужно повозиться.

Итак, устанавливаем эту библиотеку:

github.com/bouk/monkey

Пишем наш тест и «мокаем» метод http.get:

func TestHttpGet(t *testing.T) {
   // patching http.Get method
   var guard *monkey.PatchGuard
   guard = monkey.PatchInstanceMethod(reflect.TypeOf(http.DefaultClient), "Get", func(c *http.Client, url string) (*http.Response, error) {
      guard.Unpatch()
      defer guard.Restore()

      if url != "https://example.com" {
         return nil, fmt.Errorf("wrong url")
      }
      return &http.Response{Status: "200"}, nil
   })

   response, _ := http.Get("https://example.com")
   assert.Equal(t, "200", response.Status)

   _, err := http.Get("https://another-example.com")
   assert.Error(t, err)
}

Запускаем и убеждаемся что да, наш метод из пакета http.get был заменен на нашу функцию. Тем самым появляется возможность писать более понятные и простые юнит тесты, вызывающие сторонние пакеты.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *