我有类似的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