Skip to content

Instantly share code, notes, and snippets.

@manhdaovan
Created June 11, 2019 14:12
Show Gist options
  • Save manhdaovan/6dbd06964eb2e6eaca0c80afe4d678b6 to your computer and use it in GitHub Desktop.
Save manhdaovan/6dbd06964eb2e6eaca0c80afe4d678b6 to your computer and use it in GitHub Desktop.
mocking testing with io.Reader and io.Writer
// GetTextAndDisplay reads and display data to io
func GetTextAndDisplay(r io.Reader, w io.Writer) error {
buf := make([]byte, 10<<20) // 10MB
readBytes, err := r.Read(buf)
if err != nil {
return err
}
_, err = w.Write(buf[0:readBytes])
if err != nil {
return err
}
return nil
}
// Testing
type mockReaderOk struct {
bytes []byte
}
func (mro *mockReaderOk) Read(bytes []byte) (int, error) {
src := []byte("reader ok")
for i, b := range src {
bytes[i] = b
}
return len(src), nil
}
type mockReaderErr struct{}
func (mre *mockReaderErr) Read(b []byte) (int, error) {
return 0, fmt.Errorf("error on Reader")
}
type mockWriterOk struct {
bytes []byte
}
func (mwo *mockWriterOk) Write(b []byte) (int, error) {
mwo.bytes = b
return len(b), nil
}
type mockWriterErr struct {
bytes []byte
}
func (mwe *mockWriterErr) Write(b []byte) (int, error) {
return 0, fmt.Errorf("error on Writer")
}
func TestGetTextAndDisplay(t *testing.T) {
t.Run("reader ok, writer ok", func(t *testing.T) {
r := &mockReaderOk{}
w := &mockWriterOk{}
var wantErr error
wantStr := "reader ok"
if err := GetTextAndDisplay(r, w); !reflect.DeepEqual(wantErr, err) {
t.Errorf("GetTextAndDisplay() error = %v, wantErr %v", err, wantErr)
return
}
if gotStr := string(w.bytes); gotStr != wantStr {
t.Errorf("GetTextAndDisplay() = %v, want %v", gotStr, wantStr)
}
})
t.Run("reader error, writer ok", func(t *testing.T) {
r := &mockReaderErr{}
w := &mockWriterOk{}
wantErr := fmt.Errorf("error on Reader")
wantStr := ""
if err := GetTextAndDisplay(r, w); !reflect.DeepEqual(wantErr, err) {
t.Errorf("GetTextAndDisplay() error = %v, wantErr %v", err, wantErr)
return
}
if gotStr := string(w.bytes); gotStr != wantStr {
t.Errorf("GetTextAndDisplay() = %v, want %v", gotStr, wantStr)
}
})
t.Run("reader ok, writer error", func(t *testing.T) {
r := &mockReaderOk{}
w := &mockWriterErr{}
wantErr := fmt.Errorf("error on Writer")
wantStr := ""
if err := GetTextAndDisplay(r, w); !reflect.DeepEqual(wantErr, err) {
t.Errorf("GetTextAndDisplay() error = %v, wantErr %v", err, wantErr)
return
}
if gotStr := string(w.bytes); gotStr != wantStr {
t.Errorf("GetTextAndDisplay() = %v, want %v", gotStr, wantStr)
}
})
t.Run("reader error, writer error", func(t *testing.T) {
r := &mockReaderErr{}
w := &mockWriterErr{}
wantErr := fmt.Errorf("error on Reader")
wantStr := ""
if err := GetTextAndDisplay(r, w); !reflect.DeepEqual(wantErr, err) {
t.Errorf("GetTextAndDisplay() error = %v, wantErr %v", err, wantErr)
return
}
if gotStr := string(w.bytes); gotStr != wantStr {
t.Errorf("GetTextAndDisplay() = %v, want %v", gotStr, wantStr)
}
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment