Golang에서 단위 테스트를 조롱하는 방법

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의 구현을 조롱하는 데 사용되는 함수입니다.
  • newAddEventFakeRepositoryAddEventFakeRepository의 인스턴스를 생성한 다음 오류를 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

    좋은 웹페이지 즐겨찾기