Go1.16으로 추가된 iotest.ErrReader io를 사용합니다.Reader의 예외 시스템 테스트

8342 단어 Gotech

io.ReadAll과 같은 예외 시스템을 테스트하고 싶습니다.


예를 들어 아래io.Reader를 받아들이고 내용 문자열의 함수를 되돌려 주려고 할 때io.ReadAll는 되돌려 주기 어려워err하기 때문에 이상 시스템의 테스트를 쓰기 어렵다.
read.go
import "io"

func read(r io.Reader) (string, error) {
	b, err := io.ReadAll(r)
	if err != nil {
		return "", err
	}

	return string(b), nil
}

iotest.ErrReader를 사용하면 됩니다.


Go 1.16에서 새로 추가된testing/iotest 포장에 추가된iotest.ErrReader을 사용하면 수반된io.Reader 함수의 이상 시스템을 간단하게 테스트할 수 있다.
read_test.go
import (
	"errors"
	"io"
	"strings"
	"testing"
	"testing/iotest"
)

func Test_read(t *testing.T) {
	t.Parallel()

	cases := map[string]struct {
		r     io.Reader
		str   string
		noErr bool
	}{
		"success": {
			r:     strings.NewReader("test"),
			str:   "test",
			noErr: true,
		},
		"failure": {
			r:     iotest.ErrReader(errors.New("test")),
			str:   "",
			noErr: false,
		},
	}

	for name, c := range cases {
		c := c
		t.Run(name, func(t *testing.T) {
			t.Parallel()

			str, err := read(c.r)

			if str != c.str {
				t.Errorf("want '%v', got '%v'", c.str, str)
			}
			if c.noErr {
				if err != nil {
					t.Error("want 'nil', got 'not nil'")
				}
			} else {
				if err == nil {
					t.Error("want 'not nil', got 'nil'")
				}
			}
		})
	}
}

덮어쓰기도 좋아요.


좋은 웹페이지 즐겨찾기