如何为从stdin读取的内容编写goTest函数



我有类似的go测试代码:

func TestRollback(t *testing.T) {
store := NewStore()

// do some stuff
err := store.Rollback()

// checks
}

问题出在存储上。Rollback((具有从stdin读取y或n 的提示

如何发送";y";运行go test -v --run TestRollback时的测试过程

测试Rollback方法的困难源于对其对singletonos.Stdin的依赖进行硬编码。Tinkerer的答案是可行的,但由于它对包级别的变量进行了变异,因此不适合并行运行测试。

一个优选的替代方案(IMO(包括使用接口。测试通常与Go中的接口押韵。这里,因为os.Stdin满足io.Reader接口,所以可以通过传递给工厂函数的io.Reader来参数化Store类型:

type Store struct {
// other fields, omitted here
in io.Reader
}
func NewStore(in io.Reader) *Store {
store := Store {
// other fields, omitted here
in: in,
}
return &store
}

然后,在测试函数中,可以使用满足io.Reader并且易于配置的具体类型,例如*strings.Reader:

func TestRollback(t *testing.T) {
// arrange
in := strings.Reader("-- put contents of stdin here --")
store := NewStore(in)
// act
err := store.Rollback()
// assert
// ...
}

以下内容可以临时重定向stdin。

rd,wr,err := os.Pipe()
saved := os.Stdin
os.Stdin = rd
... Test code feeds wr ...
os.Stdin = saved

最新更新