Не могу смоделировать структуру для тестирования - PullRequest
0 голосов
/ 22 февраля 2020

Попытка макета структуры для тестирования. Но следующий код имеет ошибку:

./test.go:32:17: cannot use NewClass() (type *Class) as type mockClass in return argument:
    *Class does not implement mockClass (wrong type for Query method)
        have Query() *Iterator
        want Query() mockIterator

Почему я не могу этого сделать?

func NewClass() *Class {
    return &Class{}
}

type Class struct{}

func (Class) Query() *Iterator {
    return &Iterator{}
}

type Iterator struct{}

func (Iterator) Next() error {
    return nil
}

type mockClass interface {
    Query() mockIterator
}

type mockIterator interface {
    Next() error
}

var newMock = func() mockClass {
    return NewClass()
}

В тесте я хочу присвоить newMock что-то вроде:

newMock = funcr() mockClass {
    return &fakeClass{}
}

Структуры Class и Iterator не находятся под моим контролем. Эти структуры взяты из внешней библиотеки.

1 Ответ

0 голосов
/ 22 февраля 2020
  1. Создайте интерфейс, который выражает бизнес-логику c, которая нужна вашему компоненту. Не используйте сторонние типы.
  2. Используйте этот интерфейс в вашей бизнес-логи c.
  3. Создайте реализацию этого интерфейса, обертывающую стороннюю библиотеку, и передайте ее компоненту в main.go Это хорошее место для подключения / ввода различных компонентов системы.

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

Если по какой-то причине вы привязаны к этой библиотеке и не существует способа создать интерфейс, не ссылающийся на сторонние типы, посмотрите на Можно ли издеваться код библиотеки с вложенным интерфейсом?

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