Как исправить «отсутствующий тип в составном литерале» в тестовых примерах - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь написать тестовый код для функции 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 Ответ

1 голос
/ 05 апреля 2019

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

    //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...
...