Я использую голландские кодеры / 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()
Итак, что мне делать?
- Изменить go клиента? Я бы не хотел этого делать, поскольку я реализовал это во всем своем коде.
- Реализация ftp-сервера dev: может быть хорошей и простой идеей, но я буду смешивать модульный тест и функциональный тест, сохраняя внешняя зависимость.
- Находим техническое решение моей проблемы и высмеиваем его?