go - 用于单元测试的模拟 bufio 外部包

标签 go

我需要模拟 bufio Reader供测试用。特别是 ReadString API。

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

NewReader 返回 bufio.Reader。 由于它不返回抽象/接口(interface),因此我无法为 Reader 创建适配器。

你能帮忙吗?

最佳答案

您始终可以定义自己的界面

// 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(strings.NewReader("Foo")),
    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)
  }
}

关于go - 用于单元测试的模拟 bufio 外部包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50803598/

相关文章:

http - 在golang fasthttp中获取任意请求 header value

go - 有人能解释一下为什么 GOPATH 很方便以及它应该如何使用吗?

go - 如何解码被拦截的gRPC请求/响应以查看golang中已发送/已接收的protobuf消息?

go - 如何让多个对象从一个go子程序中获取数据

google-app-engine - 如何提供 Blobstorage 图像的大型 zip 文件?

json - 用sql.NullFloat64包装json.Number

json - 错误 : interface conversion interface {} is []interface {}, 不是映射 [字符串] 接口(interface) {}

go - 在 Go 中对字符串进行分区

go - 无法从 Go 安装 Revel 框架

go - go中如何比较两个模板,例子得到了意想不到的结果