> 백엔드 개발 > Golang > Go에서 열거형에 대해 명령줄 플래그 값을 단위 테스트하는 방법은 무엇입니까?

Go에서 열거형에 대해 명령줄 플래그 값을 단위 테스트하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-05 09:59:02
원래의
891명이 탐색했습니다.

How to Unit Test Command Line Flag Values Against an Enumeration in Go?

Go에서 명령줄 플래그 테스트

이 문서에서는 Golang의 명령줄 플래그에 대한 테스트 기술을 살펴봅니다. 특히, 열거형에 대해 플래그 값을 단위 테스트하는 방법을 살펴보겠습니다.

문제 설명

다음 코드가 주어졌을 때:

<code class="go">// Define flag for output format
var formatType string

// Constants representing valid format types
const (
    text = "text"
    json = "json"
    hash = "hash"
)

// Initialize flags
func init() {
    flag.StringVar(&formatType, "format", "text", "Desired output format")
}

// Main function
func main() {
    flag.Parse()
}</code>
로그인 후 복사

우리는 -format 플래그 값이 미리 정의된 상수 중 하나와 일치하는지 확인하기 위해 단위 테스트를 작성하려고 합니다.

사용자 정의 플래그 유형을 사용하는 솔루션

더 많은 플래그를 테스트하려면 유연한 방식으로 Value 인터페이스를 구현하는 사용자 정의 유형과 함께 flag.Var 함수를 활용할 수 있습니다.

<code class="go">package main

import (
    "errors"
    "flag"
    "fmt"
)

// Custom type representing format type
type formatType string

// String() method for Value interface
func (f *formatType) String() string {
    return fmt.Sprint(*f)
}

// Set() method for Value interface
func (f *formatType) Set(value string) error {
    if len(*f) > 0 && *f != "text" {
        return errors.New("format flag already set")
    }
    if value != "text" && value != "json" && value != "hash" {
        return errors.New("Invalid Format Type")
    }
    *f = formatType(value)
    return nil
}

// Initialize flag with custom type
func init() {
    typeFlag := "text" // Default value
    usage := `Format type. Must be "text", "json" or "hash". Defaults to "text".`
    flag.Var(&typeFlag, "format", usage)
}

// Main function
func main() {
    flag.Parse()
    fmt.Println("Format type is", typeFlag)
}
</code>
로그인 후 복사

이 솔루션에서 flag.Var는 Value 인터페이스를 충족하는 사용자 정의 유형에 대한 포인터를 가져옵니다. Set 메서드 내에서 자체 유효성 검사 논리를 정의합니다.

사용자 정의 플래그 유형 단위 테스트

사용자 정의 플래그 유형에 대한 단위 테스트는 다음과 같이 작성할 수 있습니다.

<code class="go">// Test unit validates that the format flag is within the enumeration
func TestFormatFlag(t *testing.T) {
    testCases := []struct {
        input       string
        expectedErr string
    }{
        {"text", ""},
        {"json", ""},
        {"hash", ""},
        {"", "Invalid Format Type"},
        {"xml", "Invalid Format Type"},
    }

    for _, tc := range testCases {
        t.Run(tc.input, func(t *testing.T) {
            args := []string{"-format", tc.input}
            flag.CommandLine = flag.NewFlagSet("test", flag.PanicOnError)
            err := flag.CommandLine.Parse(args)

            if err != nil && err.Error() != tc.expectedErr {
                t.Errorf("Unexpected error: %v", err)
                return
            }
        })
    }
}</code>
로그인 후 복사

위 내용은 Go에서 열거형에 대해 명령줄 플래그 값을 단위 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿