Проверьте, что метод вызывается в обработчике в Голанге - PullRequest
0 голосов
/ 18 сентября 2018

Я реализую API на Голанге. У меня есть конечная точка, где я вызываю метод с параметрами другого пакета. Теперь мне нужно проверить, что этот метод был вызван в запросе.

Ниже приведен небольшой аналогичный сценарий того, что я делаю и чего ожидаю.

Мой обработчик

package myPackage
import (
    "log"
    "github.com/myrepo/notifier" // my another package
)

func MyHandler(writer http.ResponseWriter, request *http.Request) { 
    // ...
    // ...

    notifier.Notify(4, "sdfsdf")

    // ...
    // ...

}

Обработчик тестирования

func TestMyHandler(t *testing.T) {
    // Here I want to 
    req, _ := http.NewRequest("GET", "/myendpoint", nil)
    // ... Want to test that notifier.Notify is called
    // ...
}

В TestMyHandler я хочу проверить, что notifier.Notify вызвал.

Выводы

Я пытался понять AssertNumberOfCalls , func (* Mock) Вызывается и func (* Mock) MethodCalled , но я не уверен, как использовать их: (.

Я новичок в Голанге и очень рад этому. Пожалуйста, дайте мне знать, если я что-то пропустил, или вам может понадобиться больше информации для понимания.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Это хорошая возможность использовать внедрение зависимостей и интерфейсы.

А именно, нам нужно извлечь концепцию Notifier

(предупреждение: код не тестируется напрямую)

type Notifier interface {
    Notify(int, string)() error
}

Теперь, чтобы избежать путаницы с библиотекой notifier, используйте локальный псевдоним.

import "github.com/myrepo/notifier" mynotifier

Тогда, поскольку используемая библиотека экспортирует ее как функцию, а не вструктура, нам нужно создать структуру, которая реализует наш интерфейс

type myNotifier struct {}

func (mn *myNotifier) Notify(n int, message string) error {
  return mynotifier.Notify(n, message)
}

Затем вы модифицируете свою функцию:

func MyHandler(writer http.ResponseWriter, request *http.Request, notifier Notifier) { 
    // ...
    // ...

    notifier.Notify(4, "sdfsdf")

    // ...
    // ...

}

Затем в тесте вы можете свободноотправить в шпион уведомитель

type spyNotifier struct {
  called boolean
}

func (n *spyNotifier) Notify(n int, msg string) error {
  n.called = true
  return
}
0 голосов
/ 18 сентября 2018

Хотите проверить, что называется уведомитель. Уведомление называется.

Нет, нет. Вы заинтересованы в том, чтобы обработчик делал то, что должен, и он состоит из двух вещей:

  1. Возвращает правильный ответ (легко проверить с помощью net / http / httptest.ResponseRecorder) и

  2. Имеет некоторый заметный побочный эффект, здесь выдают некоторое уведомление.

Для проверки 2. вы проверяете, что было выдано уведомление, а не что была вызвана какая-то функция. Что бы ни приводили результаты notify.Notify (например, запись в базе данных, файл, какой-либо HTTP-вызов), следует проверить. Формально это больше не модульное тестирование, но тестирование на побочные эффекты никогда не является строгим модульным тестированием.

Что вы можете сделать: оберните логику вашего обработчика в некоторый объект и наблюдайте за состоянием этих объектов. Некрасиво. Не.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...