Created
June 11, 2019 14:12
-
-
Save manhdaovan/6dbd06964eb2e6eaca0c80afe4d678b6 to your computer and use it in GitHub Desktop.
mocking testing with io.Reader and io.Writer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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