#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. Вам нужен ввод именованного типа, очищенный отдельно, или вам придется повторять все определение каждый раз (вы этого не хотите). Просто используйте плоскую структуру.
Ответ №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...