>백엔드 개발 >Golang >효과적인 테스트를 위해 Go에서 모의 ​​함수를 어떻게 만들 수 있나요?

효과적인 테스트를 위해 Go에서 모의 ​​함수를 어떻게 만들 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-05 09:15:14633검색

How Can I Mock Functions in Go for Effective Testing?

Go에서 모의 ​​가능한 함수를 만드는 방법

Go에서는 구체적인 유형 내에 선언된 특정 함수를 모의하는 것이 불가능합니다. 그러나 테스트 가능성을 달성하기 위해 사용할 수 있는 몇 가지 옵션이 있습니다.

함수 값 모의

변수, 구조체 필드 또는 함수 매개변수로 존재하는 함수 값은 Go에서 모의할 수 있습니다. 다음을 고려하십시오.

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())

이러한 각 경우에 Fn은 모의 가능합니다.

인터페이스 활용

인터페이스는 Go에서 효과적이고 선호되는 모의 수단을 제공합니다. 다음 예를 고려하십시오.

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

// Real implementation
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// Mock implementation
type ProductRepositoryMock struct {}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}

ProductRepository에 의존하는 코드는 일반적인 실행을 위해 ProductStore를 활용하고 테스트 목적으로 ProductRepositoryMock을 활용할 수 있습니다.

인터페이스를 통해 기능 조정

대부분을 유지하려면 모의를 활성화하는 동안 함수의 원래 구조를 유지하면서 함수에 전달될 유형의 메서드를 미러링하는 인터페이스를 만듭니다. 그런 다음 인터페이스의 모의 버전을 모두 구현하고 테스트 중에 활용합니다.

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // ...
}

type DBMock struct {}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
   ...
}

이제 GetProductByName의 DB 매개변수를 모의할 수 있습니다.

위 내용은 효과적인 테스트를 위해 Go에서 모의 ​​함수를 어떻게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.