Golang에서 단위 테스트를 조롱하는 방법
11540 단어 oopprogramminggotesting
First of all I just want you guys to know that I'm not a golang expert, I started to use golang as a hobbyist a few months ago but now every web backend project I use it.
체계
화살표 방향은 도메인 레이어가 앱 레이어에 대한 아이디어가 없다는 것을 의미하므로 이를 코드에 유지하겠다고 약속합니다.
그게 다야 ! 자체 테스트에 집중하기 위해 가능한 한 간단하게 시작하고 이 시스템에 더 많은 계층을 추가하고 이 다이어그램을 업데이트할 수 있지만 지금은 그게 다입니다.
도메인 계층
event.go
package domain
import "time"
type Event struct {
Title string
Date time.Time
Place string
Category string
KeyWords []string
}
type EventSaver interface {
Save(Event) error
}
Event
는 시스템의 이벤트EventSaver
는 종종 시스템의 사용 사례라고 하는 이벤트를 어떻게든 저장하려는 사람이 구현하게 될 인터페이스입니다. 사용 사례 계층
간단히 하기 위해 이벤트를 저장하고 호출한 사람에게 오류를 전달하는
AddEvent Memory
라는 하나의 사용 사례를 만들었습니다.event.go
package usecases
import (
"github.com/iamseki/dev-to/domain"
)
type AddInMemoryRepository interface {
Add(domain.Event) error
}
type AddEventInMemory struct {
repository AddInMemoryRepository
}
func (usecase *AddEventInMemory) Save(e domain.Event) error {
err := usecase.repository.Add(e)
return err
}
func NewAddEventInMemory(r AddInMemoryRepository) *AddEventInMemory {
return &AddEventInMemory{repository: r}
}
테스트
testing
내장 패키지를 사용하면 go에서 단위 테스트 작성을 쉽게 시작할 수 있습니다.이 코드의 평화에 초점을 맞추겠습니다.
type addEventFakeRepository struct {
MockAddFn func(domain.Event) error
}
func (fake *addEventFakeRepository) Add(e domain.Event) error {
return fake.MockAddFn(e)
}
func newAddEventFakeRepository() *addEventFakeRepository {
return &addEventFakeRepository{
MockAddFn: func(e domain.Event) error { return nil },
}
}
addEventFakeRepository
struct는 Add 메서드의 구현으로 인해 AddInMemoryRepository
인터페이스를 구현하므로 추가 이벤트 사용 사례에 삽입할 수 있습니다.MockAddFn
AddInMemoryRepository
의 구현을 조롱하는 데 사용되는 함수입니다.newAddEventFakeRepository
는 AddEventFakeRepository
의 인스턴스를 생성한 다음 오류를 nil로 반환하는 성공 사례를 조롱합니다. 그러나 성공의 경우가 바람직하지 않은 경우 다음과 같이 모의 함수를 설정할 수 있습니다.
func TestAddEventInMemoryCustom(t *testing.T) {
r := newAddEventFakeRepository()
r.MockAddFn = func(e domain.Event) error {
// do something diferent here !
}
sut := usecases.NewAddEventInMemory(r)
}
usecases 패키지의 모든 테스트 소스 코드:
event_test.go
package usecases_test
import (
"testing"
"github.com/iamseki/dev-to/domain"
"github.com/iamseki/dev-to/usecases"
)
type addEventFakeRepository struct {
MockAddFn func(domain.Event) error
}
func (fake *addEventFakeRepository) Add(e domain.Event) error {
return fake.MockAddFn(e)
}
func newAddEventFakeRepository() *addEventFakeRepository {
return &addEventFakeRepository{
MockAddFn: func(e domain.Event) error { return nil },
}
}
func TestAddEventInMemorySucceed(t *testing.T) {
r := newAddEventFakeRepository()
sut := usecases.NewAddEventInMemory(r)
err := sut.Save(domain.Event{})
if err != nil {
t.Error("Expect error to be nil but got:", err)
}
}
고려 사항
나는 이것이 누군가에게 유용할 수 있기를 바랍니다. 나는 여기서 설명하는 방식으로 내 테스트를 조롱하는 것을 정말 좋아하지만 그것이 얼마나 관용적인지에 대해 꽤 확신하지 못하므로 제안을 엽니다!
📜 source code
Reference
이 문제에 관하여(Golang에서 단위 테스트를 조롱하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chseki/how-i-mock-unit-tests-in-golang-3dcp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)