Передать функции вспомогательному методу - PullRequest
0 голосов
/ 15 января 2020

Возможно ли в Go перебирать набор функций?

У меня есть этот вспомогательный метод в моем файле модульного теста:

func helper(t *testing.T, f func(string) bool, stringArray []string, expected bool) {
    for _, input := range stringArray {
        if f(input) != expected {
            t.Errorf("Expected '%v' for string: %v", !expected, input)
        }

    }
}

Вместо копирования / вставки линии и изменение второго перамитера следующим образом:

func Test_isUnique(t *testing.T) {
    var valid = []string{"", "b", "ab", "acd", "asdfjkl", "aA"}
    var invalid = []string{"aa", "avva", "aaa", "asdfweryhfda", "asdfjkal"}
    helper(t, funcA, valid, true)
    helper(t, funcB, invalid, false)
    helper(t, funcC, valid, true)
    helper(t, funcD, invalid, false)
    helper(t, funcE, valid, true)
    helper(t, funcF, invalid, false)
    helper(t, funcG, valid, true)
    helper(t, funcH, invalid, false)
}

Вместо этого я задаюсь вопросом, есть ли здесь опция для уменьшения этой функции до 4-х строчной функции тела

  for f in [funcA, funcB, funcB, funcC, funcD, etc]: // Fix this
    helper(t, f, valid, true)
    helper(t, f, invalid, false)

Прости микс python / go выше :)

Ответы [ 2 ]

1 голос
/ 15 января 2020

Идиоматический c go способ заключается в использовании табличных тестов:

func TestMyFunction(t *testing.T) {
  valid := []string{"", "b", "ab", "acd", "asdfjkl", "aA"}
  cases := []struct{
    name string,
    f func(string) bool
    input []string
    expected bool
  }{
    {
       "Test func a",
       funcA,
       valid,
       true
    },
    // Other test cases
  }

  for _, tc := range cases {
      t.Run(tc.name, func(t *testing.T) {
          helper(t, tc.func, tc.input, tc.expected)
      })
  }
}

В качестве примечания: вы можете явно пометить вспомогательные функции, используя Helper функция. Это гарантирует, что ваша вспомогательная функция будет исключена из информации о строке, напечатанной при выполнении тестов:

func helper(t *testing.T) {
  t.Helper()
  // Helper function code
}
1 голос
/ 15 января 2020

Да, это возможно. Например, вы можете выбирать любые фрагменты, включая те, чей тип элемента является типом функции. Просто поместите ваши функции в срез:

fs := []func(string) bool{funcA, funcB, funcC, funcD, ...}

for _, f := range fs {
    helper(t, f, valid, true)
    helper(t, f, invalid, false)
}

Также для того, чего вы пытаетесь достичь, тесты на основе таблиц могут быть более подходящими. Пожалуйста, проверьте Go Wiki: Табличные тесты , а также Блог Go: использование подтестов и под-тестов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...