Как проверить неэкспортированную (личную) функцию в go (golang)?
Мне было интересно создать unit test для "невыполненных (частных) функций" в go. Однако в основном очень сложно создавать модульные тесты, которые формируют их в тестовом пакете, потому что я должен сделать их "общедоступными". Который, в конце концов, побеждает в том, что все они являются частными. Дело в том, что эта вспомогательная функция помогает модулировать и теперь, когда они являются модульными, было бы неплохо иметь возможность создавать для них единичные тесты, не делая их доступными для всех, кроме тестового пакета, хорошо, что они не являются функциями, к которым следует обращаться, или используемый кем-либо другим, кроме набора для тестирования или самого фактического пакета.
Любые предложения? Можно ли экспортировать только в свой собственный пакет и 1 дополнительный пакет или что-то подобное в go?
Ответы
Ответ 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".
НО, вся цель модульных тестов - проверить "внешний интерфейс" (т.е. публичные функции) на ваш пакет. Это модульные тесты всегда должны быть "белыми коробками" (см. Тестирование белых ящиков). Таким образом, вы можете реорганизовать свой код, и ваши тесты не будут нарушены.
Конечно, иногда вы хотите проверить внутреннюю согласованность, что невозможно благодаря "внешнему интерфейсу". Для этого я нашел неопровержимые утверждения. Другой возможностью было бы добавить публичную "диагностическую" функцию с именами, которые показывают, что они не предназначены для нормального использования.