undefined main - тестовый код не может получить доступ к основному пакету - PullRequest
0 голосов
/ 10 июля 2020

В приведенном ниже коде:

.. / folder1 / some_test. go

package main_test

import "testing"

func TestF(t *testing.T) {
    main.F()
}

.. / folder1 / some_file. go

package main

func F() {

}

main.F() дает undefined main

$ go version
go version go1.14.3 linux/amd64

Переименование имени пакета с main_test на main решает проблему.

Почему main_test имя пакета не допускается для код тестирования, в той же папке?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вы должны импортировать пакет, чтобы использовать его.

go .mod:

module example.app

main. go:

package main

func F() {}

func main() {}

main_test . go

package main_test

import (
    "testing"
    "example.app"  // import the main package
)

func TestF(t *testing.T) {
    main.F()
}

В приведенном выше коде предполагается, что основные *. go находятся в том же каталоге, что и go .mod для пакета example.app. Замените example.app именем вашего модуля. Отрегулируйте пути в соответствии с вашим приложением. Например, если основные файлы *. go находятся в каталоге cmd/example ниже каталога, содержащего go .mod, используйте путь импорта example.app/cmd/example вместо example.app.

Примечание. что тест может импортировать основной пакет таким образом, а не тестовый код - нет.

0 голосов
/ 10 июля 2020

Проблема в том, что main_test - это пакет, отличный от main.

Для доступа к функциям в main вам необходимо импортировать main и получить доступ к таким функциям, как это: main.F()

Также обратите внимание, что f начинается со строчных букв и поэтому не экспортируется из пакета main. Чтобы получить к нему доступ в main_test, его необходимо экспортировать (что можно сделать, изменив его так, чтобы он начинался с заглавной буквы: F).

В качестве альтернативы вы можете изменить тестовый файл, чтобы он находился в пакете main.

Редактировать с примечанием: при импорте main обратите внимание, что пути импорта определяются по имени каталога. Обычно разработчики в Go помещают свои пакеты в каталоги с тем же именем, что и пакет (например, помещают main в каталог с именем main). В вашем случае имена пакета и каталога отличаются, поэтому импорт будет import ".../folder1", а не import ".../main". Вы по-прежнему сможете использовать main.F() для доступа к функции:

package main_test

import (
   "testing"
   "../folder1" // use the full path to folder1 from the root of your module
)

func TestF(t *testing.T) {
    main.F()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...