io.Reader 및 io모크 Writer를 원합니다.
io.Reader / io.Writer란 무엇입니까?
Go에서 바이트 열을 읽거나 쓸 때는 io.Reader 및 io.Writer를 사용해야 합니다.예를 들어 프로그램 라이브러리를 실현할 때 바이트열의 읽기나 쓰기가 발생하면 이 인터페이스가 설치된 임의의 대상을 받아들인 다음에 실제 읽기와 쓰기를 이 대상에게 양도하는 것이 표준이다.왜 이 방법이 가장 좋은지 꼭 한 번 보세요Qita.
시험의 번거로움
io.Reader
와 io.Writer
의 실현은 실제 코드를 작성하고 사용자가 사용하는 단계에서 매우 편리하지만 약간의 번거로움이 있다.그게 시험이야.문자열을 수신하거나 반환하는 설치에 비해 어쨌든 '오류 처리'가 있을 수 있습니다. 테스트의 덮어쓰기를 확보하기 위해서는 다양한 장소에서 오류를 높여야 하지만 표준 라이브러리에는 이를 간단하게 실현할 수 있는 메커니즘이 없습니다.처음엔 쓸 때마다 필요에 맞게 쓰는 게 좋지 않을까 생각했는데 실제로는 아주 간단한 구조로 이룰 수 있다는 걸 알고 시행해 봤어요.iomock으로 가벼운 mock.
iomock는 간단한 모크 인터페이스
io.Reader
와 io.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.Buffer
와 strings.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.Reader
와io.Writer
,그런데 그걸 사용한 개발공사는 번거롭고 힘들었어요.iomock을 통해 누구의 Go 생활을 조금 더 풍요롭게 할 수 있다면, 나는 매우 기쁠 것이다!
Reference
이 문제에 관하여(io.Reader 및 io모크 Writer를 원합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ktnyt/articles/ba4b08504eb5ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)