Подтвердить что ты не робот

Как проверить неэкспортированную (личную) функцию в go (golang)?

Мне было интересно создать unit test для "невыполненных (частных) функций" в go. Однако в основном очень сложно создавать модульные тесты, которые формируют их в тестовом пакете, потому что я должен сделать их "общедоступными". Который, в конце концов, побеждает в том, что все они являются частными. Дело в том, что эта вспомогательная функция помогает модулировать и теперь, когда они являются модульными, было бы неплохо иметь возможность создавать для них единичные тесты, не делая их доступными для всех, кроме тестового пакета, хорошо, что они не являются функциями, к которым следует обращаться, или используемый кем-либо другим, кроме набора для тестирования или самого фактического пакета.

Любые предложения? Можно ли экспортировать только в свой собственный пакет и 1 дополнительный пакет или что-то подобное в go?

4b9b3361

Ответ 1

создать тестовый файл внутри пакета

library_test.go

package mypkg

func TestPrivateStruct(t *testing.T){
  pf := private{ "Private Field" }
  ....
}

library.go

package mypkg

type private struct {
  privateField string
}

go test mypkg -v будет запускать ваши тесты с помощью вашей частной структуры

Ответ 2

Во-первых, вы можете иметь оба типа тестов в том же месте, что и ваш пакет, используя имя пакета для внутренних тестов (например, mypkg) и используя одно и то же имя пакета с "_test", добавленным для "внешние" тесты (например, mypkg_test). Оба типа тестов должны быть в файлах, имя которых заканчивается на "_test.go".

НО, вся цель модульных тестов - проверить "внешний интерфейс" (т.е. публичные функции) на ваш пакет. Это модульные тесты всегда должны быть "белыми коробками" (см. Тестирование белых ящиков). Таким образом, вы можете реорганизовать свой код, и ваши тесты не будут нарушены.

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