我需要模拟 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/