Невозможно получить доступ к частному методу в том же пакете для тестирования

У меня в одном пакете 2 файла.

# my_package1/my_file1.go

func myFunc1() {
  //....
} 

# my_package1/my_file1_test.go

type MyPackageSuite struct {
  suite.Suite
}

func (s *MyPackageSuite) MyTest1() {
  //...............

  res1 := myFunc1()

  //...............
} 

Я провожу тест go test my_package1/my_file1_test.go -v, и он возвращает undefined: myFunc1

Но они в одной упаковке. Почему ошибка? Как это исправить? Я не ищу сделать метод общедоступным.

Обновление1:

$ ls webhook
doc.go      webhook.go  webhook_test.go

потом

$ go test webhook
can't load package: package webhook: malformed module path "webhook": missing dot in first path element


$ go test webhook/webhook
can't load package: package webhook/webhook: malformed module path "webhook/webhook": missing dot in first path element

$ go test webhook/webhook.go
?     command-line-arguments  [no test files]


$ go test webhook/webhook_test.go 
# command-line-arguments [command-line-arguments.test]
webhook/webhook_test.go: undefined: myFunc1
FAIL  command-line-arguments [build failed]
FAIL

person Totto    schedule 03.12.2019    source источник
comment
Не запускайте тест, используя имя файла. Либо cd в пакете и запустите go test, либо запустите go test ‹полное имя пакета›.   -  person Burak Serdar    schedule 03.12.2019
comment
@BurakSerdar посмотреть мое обновление   -  person Totto    schedule 03.12.2019
comment
Если он жалуется на цикл импорта, вы импортируете тот же пакет. Не делай этого. Если вы используете модули go, используйте полный путь к пакету: go test moduleName / webhook. В противном случае используйте относительный пакет dir: go test ./webhook. go test webhook пытается протестировать пакет с именем webhook, и, поскольку у него нет имени хоста в качестве первого компонента, предполагается, что это пакет stdlib.   -  person Burak Serdar    schedule 03.12.2019
comment
@BurakSerdar, запускающий go test из каталога пакета, вызывает import cycle not allowed in test. В противном случае без этого теста с частным методом он работает. То есть это работает, если я не использую тест с частным методом - ›go test webhook/webhook_test.go   -  person Totto    schedule 03.12.2019
comment
@BurakSerdar - нет. Прочтите мой последний комментарий.   -  person Totto    schedule 03.12.2019
comment
Инструмент go работает с пакетами (есть несколько режимов работы с файлами, но в большинстве случаев их лучше избегать). Если вы не можете запустить простой go test (например, из-за цикла импорта или из-за того, что вы неправильно написали свой пакет при тестировании), то установка вашего пакета нарушена и должна быть исправлена. Здесь не спорят. Go запрещает циклы импорта и требует одного из двух имен пакетов в файлах _test.go.   -  person Volker    schedule 03.12.2019
comment
Если вы хотите протестировать экспортированную границу некоторого package p и иметь файл p_test.go, объявляющий себя как package p_test, тогда вы не сможете получить доступ к неэкспортированному материалу из p. Это по дизайну и нельзя обойти с помощью уродливых уловок. Просто перестань это делать.   -  person Volker    schedule 03.12.2019
comment
... См. относительные пути импорта ... относительный путь может использоваться как сокращение в командной строке. Если вы работаете в каталоге, содержащем код, импортированный как unicode, и хотите запустить тесты для unicode / utf8, вы можете ввести "go test ./utf8" вместо того, чтобы указывать полный путь. Но помните, что сказал Волкер, поскольку файл, чтобы иметь возможность получить доступ к неэкспортируемому идентификатору, он должен объявить тот же пакет, что и файл, объявляющий идентификатор.   -  person mkopriva    schedule 03.12.2019


Ответы (1)


Попробуйте go test ./my_package1 принудительно скомпилировать весь пакет.
Или, по крайней мере, сначала go build.

Идея состоит в том, чтобы убедиться, что myFunc1() был скомпилирован перед запуском тестового файла.


«malformed module path» «missing dot in first path element» предполагает, что go mod файл отсутствует:

cd /path/to/project
go mod init project
go test ./webhook
person VonC    schedule 03.12.2019
comment
@Totto Можешь попробовать go test ./webhook? У вас есть go.mod файл в вашем проекте? - person VonC; 03.12.2019