io.Reader 및 io모크 Writer를 원합니다.

8381 단어 Gogolangmocktech

io.Reader / io.Writer란 무엇입니까?


Go에서 바이트 열을 읽거나 쓸 때는 io.Readerio.Writer를 사용해야 합니다.예를 들어 프로그램 라이브러리를 실현할 때 바이트열의 읽기나 쓰기가 발생하면 이 인터페이스가 설치된 임의의 대상을 받아들인 다음에 실제 읽기와 쓰기를 이 대상에게 양도하는 것이 표준이다.왜 이 방법이 가장 좋은지 꼭 한 번 보세요Qita.

시험의 번거로움

io.Readerio.Writer의 실현은 실제 코드를 작성하고 사용자가 사용하는 단계에서 매우 편리하지만 약간의 번거로움이 있다.그게 시험이야.문자열을 수신하거나 반환하는 설치에 비해 어쨌든 '오류 처리'가 있을 수 있습니다. 테스트의 덮어쓰기를 확보하기 위해서는 다양한 장소에서 오류를 높여야 하지만 표준 라이브러리에는 이를 간단하게 실현할 수 있는 메커니즘이 없습니다.처음엔 쓸 때마다 필요에 맞게 쓰는 게 좋지 않을까 생각했는데 실제로는 아주 간단한 구조로 이룰 수 있다는 걸 알고 시행해 봤어요.

iomock으로 가벼운 mock.


iomock는 간단한 모크 인터페이스io.Readerio.Writer에 사용되는 애플릿 라이브러리입니다.하지만 너무 작다고 얕보지 말고 이 간단한 구조를 사용하면 표현력이 풍부한 모크를 실제로 쓸 수 있다.예를 들어 hello 이 문자열 io.ErrClosedPipe 을 읽으면 오류 io.Reader 를 되돌려줍니다.
package main

import (
	"fmt"
	"io"

	"github.com/ktnyt/iomock"
)

func main() {
	buffer := []byte("hello")
	r := iomock.Reader(func(p []byte) (int, error) {
		n := copy(p, buffer)
		if n == 0 {
			return 0, io.ErrClosedPipe
		}
		buffer = buffer[n:]
		return n, nil
	})

	p := make([]byte, 2)
	fmt.Println(r.Read(p)) // 2 nil
	fmt.Println(r.Read(p)) // 2 nil
	fmt.Println(r.Read(p)) // 1 nil
	fmt.Println(r.Read(p)) // 0 io: read/write on closed pipe
}
이렇게 제시된 iomock.NewReader의 함수를 스마트하게 만들어서 각종 테스트 용례에 대응할 수 있다.또한 유형io.Reader이기 때문에 일반적인 표 테스트에 사용되는 구조bytes.Bufferstrings.Builder 등 대상과 병렬적으로 사용할 수 있다.그때는 아래처럼 얇은 wrapper를 쓰면 편리하게 사용할 수 있겠죠.
func newReaderMock(buffer []byte, err error) io.Reader {
	return iomock.Reader(func(p []byte) (int, error) {
		n := copy(p, buffer)
		if n == 0 {
			return 0, err
		}
		buffer = buffer[n:]
		return n, nil
	})
}
iomock.NewWriter도 기본적으로 같고 함수 형식의 서명도 같지만 매개 변수로 수신p []byte할 때 쓸 바이트열을 전송한다.이를 활용하면'n자 쓰면 오류 발생','m번 부르면 오류 발생','특정 바이트 열에서 오류 발생'등의 내용을 간단하게 쓸 수 있다.
어렵게io.Readerio.Writer,그런데 그걸 사용한 개발공사는 번거롭고 힘들었어요.iomock을 통해 누구의 Go 생활을 조금 더 풍요롭게 할 수 있다면, 나는 매우 기쁠 것이다!

좋은 웹페이지 즐겨찾기