Насмешливые функции, вызываемые из другого в golang
Я пытаюсь заглушить os.Stat
а также ioutil.ReadFile(path)
как использовать код ниже или, если вам нравится здесь, на игровой площадке [1]
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
func AssignFileValueFrom(path string, val *string) {
var (
tempValue []byte
err error
)
if _, err = os.Stat(path); err == nil {
if err != nil {
fmt.Println("There was a os stat error:", err)
}
tempValue, err = ioutil.ReadFile(path)
if err != nil {
fmt.Println("There was an io read error:", err)
}
*val = strings.TrimSpace(string(tempValue))
}
}
Я использовал свидетельство и попытался следовать примеру здесь [2]
package main
import (
"testing"
"github.com/stretchr/testify/mock"
)
type osMock struct {
mock.Mock
}
func (o osMock) Stat(path string) (interface{}, error) {
return nil, nil
}
func TestAssignFileValueFrom(t *testing.T) {
var test string
osm := new(osMock)
osm.On(`Stat`, `./.test`).Return([]byte(`1`), nil)
AssignFileValueFrom(`./.test`, &test)
// assert.Equal(t, `1`, test)
osm.AssertExpectations(t)
}
Что я не правильно делаю??
2 ответа
Ваш код с osMock
никак не влияет на исполнение AssignFileValueFrom
функция. Существует прямой вызов os.Stat
и он не будет заменен только потому, что вы объявили osMock
где-то.
Для проведения реального тестирования вы должны использовать interface
s и внедрение зависимостей, чтобы иметь возможность проверить ваш код.
Прежде всего os.Stat
вызов должен быть заменен вызовом вашей структуры, которая реализует интерфейс с тем же самым определенным методом. И вам нужно создать как минимум 2 реализации этого интерфейса: 1 - реально используемый рабочий код, 2 - макет как ваш osMock
структура для использования в тесте. И вам нужно ввести его или передать его AssignFileValueFrom
а затем использовать для вызова Stat
метод на это.
Спасибо, ребята, за ваш вклад я переписал свои тесты следующим образом..
package main
import (
"io/ioutil"
"os"
"testing"
"github.com/stretchr/testify/assert"
)
var (
err error
testFile *os.File
test string
)
const (
TestPrefix = `test_file_prefix`
FileContent = `1234`
)
func init() {
testFile, err = ioutil.TempFile(os.TempDir(), TestPrefix)
if err != nil {
panic(err)
}
err = ioutil.WriteFile(testFile.Name(), []byte(FileContent), 0644)
if err != nil {
panic(err)
}
}
func TestAssignFileValueFrom(t *testing.T) {
AssignFileValueFrom(testFile.Name(), &test)
assert.Equal(t, test, FileContent)
}