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 중국어 웹사이트의 기타 관련 기사를 참조하세요!