Go에서는 func F()와 같은 구체적인 유형에 선언된 함수를 모의합니다. {} func (T) M() {}은 불가능합니다. 그러나 유사한 기능을 달성하기 위한 다른 접근 방식이 있습니다.
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) } // The real implementer type ProductStore struct{} func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) { q := "SELECT * FROM product WHERE id = ?" // ... } // The mock implementer type ProductRepositoryMock struct{} func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) { // ... }
이제 ProductRepository를 사용하는 모든 코드는 일반 시나리오에서는 ProductStore를 사용할 수 있고 테스트 중에는 ProductRepositoryMock을 사용할 수 있습니다.
또 다른 기존 함수 선언을 보존할 수 있는 모의 옵션은 다음의 메서드를 모방하는 인터페이스를 정의하는 것입니다. *sql.DB를 사용하고 대신 사용하세요. 예를 들면 다음과 같습니다.
type DBIface interface { Query(query string, args ...interface{}) (*sql.Rows, error) // Only declare methods that are actually used. } 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!