Как мне сменить функцию, которая записывает результат в аргумент в Go - PullRequest
1 голос
/ 07 апреля 2020

Я пишу модульный тест в golang по https://github.com/stretchr/testify Предположим, у меня есть метод ниже,

func DoSomething(result interface{}) error {
    // write some data to result
    return nil
}

, поэтому вызывающий абонент может вызвать DoSomething следующим образом

result := &SomeStruct{}
err := DoSomething(result)

if err != nil {
  fmt.Println(err)
} else {
  fmt.Println("The result is", result)
}

Теперь я знаю, как использовать testify или некоторые другие инструменты для насмешки, чтобы смоделировать возвращаемое значение (здесь оно err) чем-то вроде

mockObj.On("DoSomething", mock.Anything).Return(errors.New("mock error"))

Мой вопрос: как в этом сценарии я высмеиваю result аргумент?

Поскольку result не возвращаемое значение, а аргумент, вызывающая сторона вызывает его, передавая указатель структуры, и функция модифицирует это.

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете использовать метод (*Call).Run:

Run устанавливает обработчик, который будет вызван перед возвратом. Его можно использовать при макете метода (такого как unmarshaler), который берет указатель на структуру и устанавливает свойства в такой структуре

Пример:

Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(func(args Arguments) {
    arg := args.Get(0).(*map[string]interface{})
    arg["foo"] = "bar"
})
...