#unit-testing #go
#модульное тестирование #Вперед
Вопрос:
У меня есть
type Service struct {
config *config.Config
model *model.DB
gates *config.Gates
rdb *redis.Client
}
где
type DB struct {
*sql.DB
}
Как издеваться над одним из методов struct? Не касаясь других методов.
func (e *Service) FindGateErrorId(gate, errorCode, errorMessage string, eventObj model.EventObj) (string, error) {
if errorFormat, err := e.model.GetServiceParam(eventObj.ServiceId, "error_format", eventObj.IsTest); err != nil {
return "", err
//some code
}
Ответ №1:
Создайте тип, который вы хотите имитировать, для реализации интерфейса. Затем, где бы вы ни использовали этот тип, замените переменную на этот тип переменной интерфейса, который реализует тип. Теперь любой тип, реализующий этот интерфейс, может быть заменен. Чтобы издеваться только над одним методом, но не над другими, оберните не-макет типа макетом. Пусть все другие реализованные методы в макете просто вызывают обернутый тип. Для метода, который вы хотите смоделировать, реализуйте желаемую логику.
type Animal interface {
Say()
Eat()
}
type Cat struct {}
func (c Cat) Say() {
fmt.Println("meow")
}
func (c Cat) Eat() {
fmt.Println("yum cat food meow")
}
type FunkyCatMock struct {
wrapped Cat
}
func (m FunkyCatMock) Say() {
fmt.Println("woof")
}
func (m FunkyCatMock) Eat() {
m.wrapped.Eat()
}
func main() {
var cat Animal
var mock Animal
cat = Cat{}
mock = FunkyCatMock {
wrapped: Cat{},
}
cat.Say()
cat.Eat()
mock.Say()
mock.Eat()
}
Еще одна вещь, которую следует иметь в виду, это то, что если вы обнаружите, что вы помещаете много методов в один интерфейс, вам следует подумать, как вы могли бы разбить этот интерфейс на более мелкие. Это было бы более идиоматично.
Например:
type Writer interface {
Write(p []byte) (n int, err error)
}
Go использует структурную типизацию, которая похожа на утиную типизацию в том смысле, что если она выглядит как утка и крякает как утка, то это должна быть утка.
Причина, по которой я поднимаю этот вопрос, заключается в том, что, возможно, вы могли бы определить очень узкий интерфейс и не беспокоиться о макетной реализации других методов.