Как исправить «отсутствующий тип в составном литерале» в тестовых примерах

#unit-testing #go #struct #composite-literals

#модульное тестирование #Вперед #структура #составные литералы

Вопрос:

Я пытаюсь написать тестовый код для функции ReadField(), но у меня возникают трудности с определением тестовых примеров.

Выдает ошибку «отсутствует тип в составном литерале». Я считаю, что это просто какая-то синтаксическая ошибка.

Я попытался определить структуру вне тела функции, но это все равно выдало бы ту же ошибку.

 ReadField(string, string, bool) (bool, string)
  
 
func TestReadField(t *testing.T){

    testCases := []struct {
        Name    string
        Input   struct{ 
            FirstString     string 
            SecondString    string 
            SomeBool        bool
        }
        Expected struct{
            IsValid bool
            Message string
        }
    }{
        //This is where the error points to.

        //Valid 
        {"Test Case 1",

        //Missing type error 
        {"FirstString", "SecondString", true},

        //Missing type error 
        {true, "testMessage"},},

        //Same goes for the remaining

        {"Test Case 2", 
        {"FirstString", "SecondString", false},
        {true, "testMessage"},},

        {"Test Case 3", 
        {"FirstString", "SecondString", true},
        {false, "testMessage"},},
    }

    for _, testCase := range testCases{
        t.Run(testCase.Name, func(t *testing.T){
            isValid, message := ReadField(testCase.Input.FirstString, testCase.Input.SecondString, testCase.Input.SomeBool)
            if isValid != testCase.Expected.IsValid || message != testCase.Expected.Message {
                t.Errorf("Expected: %b, %b n Got: %b, %b", testCase.Expected.IsValid, testCase.Expected.Message, isValid, message)
            } else {
                t.Logf("Expected: %b, %b n Got: %b, %b", testCase.Expected.IsValid, testCase.Expected.Message, isValid, message)
            }
        })  
    }
}
  

Комментарии:

1. Вы должны добавить префикс {… } по типу like Input{"FirstString", "SecondString", true} . Но просто не используйте вложенные типы. Ваш тест не улучшается настолько.

2. @Volker Я тоже пробовал это. Выдает ошибку, что «Ввод» не определен

3. Вам нужен ввод именованного типа, очищенный отдельно, или вам придется повторять все определение каждый раз (вы этого не хотите). Просто используйте плоскую структуру.

4. play.golang.org/p/YjiaCzfgF2i

Ответ №1:

Как указывает ошибка, вам необходимо включить тип в ваше объявление. Поскольку вы используете анонимные типы, это означает, что вы должны повторить определение типа. Это, конечно, очень раздражает:

     //Valid 
    {"Test Case 1",

    //Missing type error 
    struct{ 
        FirstString     string 
        SecondString    string 
        SomeBool        bool
    }{"FirstString", "SecondString", true},

   // etc ...
  

Итак, что вам следует сделать, это либо использовать именованные типы:

 type testInput struct{ 
    FirstString     string 
    SecondString    string 
    SomeBool        bool
}
type expected struct{
    IsValid bool
    Message string
}
testCases := []struct {
    Name     string
    Input    testInput
    Expected expected
}{
    //Valid 
    {"Test Case 1",

    //Missing type error 
    testInput{"FirstString", "SecondString", true},

    // etc ...
  

Или (мое предпочтение), сгладьте структуру верхнего уровня, сделав все намного более читаемым:

 testCases := []struct {
    Name              string
    InputFirstString  string 
    InputSecondString string 
    InputSomeBool     bool
    IsValid           bool
    Message           string
}{
    //Valid 
    {"Test Case 1",
    "FirstString",
    "SecondString",
    true,
 // etc...
  

Я также настоятельно рекомендую вам использовать метки полей в вашем определении, чтобы улучшить читаемость:

     //Valid 
    {
        Name:              "Test Case 1",
        InputFirstSTring:  "FirstString",
        InputSecondString: "SecondString",
        InputSomeBool:      true,
 // etc...