внешний пакет mof bufio для модульного тестирования - PullRequest
0 голосов
/ 11 июня 2018

Мне нужно смоделировать bufio Reader для тестирования.в частности, ReadString API.

func NewReader(rd io.Reader) *Reader
func (b *Reader) ReadString(delim byte) (string, error)

NewReader возвращает bufio.Reader.Поскольку он не возвращает абстракцию / интерфейс, я не могу создать адаптер для Reader.

Не могли бы вы помочь.

1 Ответ

0 голосов
/ 11 июня 2018

Вы всегда можете определить свой собственный интерфейс

// An interface for the minimal api our code needs to work
type StringReader interface {
  io.Reader
  ReadString(delim byte) (string, error)
}

// Use dependency injection so that we can pass in a mock
// during testing
func DoSomething(r StringReader) error {
  _, err := r.ReadString('x')
  return err
}

// MockReader allows you to intercept calls to the
// underlying bufio.Reader
type MockReader struct {
  bufio.Reader
  ReadStringFunc func(delim byte) (string, error)
}

func (r *MockReader) ReadString(delim byte) (string, error) {
  if r.ReadStringFunc != nil {
    return r.ReadStringFunc(delim)
  }
  return r.Reader.ReadString(delim)
}

// The actual test
func TestDoSomething(t *testing.T) {
  mr := MockReader{
    Reader: bufio.NewReader(os.Stdin),
    ReadStringFunc: func(delim byte) (string, error) {
      if delim != 'x' {
        t.Fatalf("want x, got %v", delim)
      }
      return "", nil
    },
  }
  if err := DoSomething(mr); err != nil {
    t.Fatal(err)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...