Макет голландских кодеров / goftp для модульного тестирования - PullRequest
0 голосов
/ 06 апреля 2020

Я использую голландские кодеры / goftp в своем коде, и для целей модульного тестирования мне нужно его смоделировать.

Дело в том, что этот компонент не имеет ни интерфейса, ни доступного издевается, поэтому я попытался создать несколько:

в goftp/ftp.go,

Я добавил интерфейс:

type FTPIface interface {
    Close() error
    Walk(path string, walkFn WalkFunc) (err error)
    Rename(from string, to string) (err error)
    Login(username string, password string) (err error)
}

Теперь я могу смоделировать все методы, которые я использую, но Connect(), потому что у connect нет получателя.

Вы используете вот так:

if client, err = goftp.Connect(Host); err != nil {
        return nil, err
    }

Поэтому я попытался изменить его, чтобы можно было его смоделировать:

func NewMyFTP(ftpIface goftp.FTPIface, host, user, password, name string) (*MyFTP, error) 
{ 
    if Client, err = ftpIface.Connect(Host); err != nil {
        return nil, err
    }
    if err = Client.Login(user, password); err != nil {
        return nil, err
    }
}

и добавил Connect() к определению интерфейса

Connect(addr string) (*FTP, error)

Дело в том, что я могу смоделировать соединение, но он вернет объект FTP, и я не смогу смоделировать Login()

Итак, что мне делать?

  1. Изменить go клиента? Я бы не хотел этого делать, поскольку я реализовал это во всем своем коде.
  2. Реализация ftp-сервера dev: может быть хорошей и простой идеей, но я буду смешивать модульный тест и функциональный тест, сохраняя внешняя зависимость.
  3. Находим техническое решение моей проблемы и высмеиваем его?
...