Go test может получить доступ к производственным функциям, но не к функциям тестирования

У меня есть проект Go 1.14 со следующей структурой каталогов:

myapp/
  server/
    payments/
      capture_payment.go
      capture_payment_test.go
  billing/
    billing.go
    billing_test.go
  fulfillment/
    fulfillment.go
    fulfillment_test.go

В моем billing.go файл у меня есть:

package billing

import (
    "fmt"
)

func Flim() {
    fmt.Println("FLIM")
}

В моем fulfillment_test.go файл у меня есть:

package fulfillment

import (
    "fmt"
)

func Flam() {
    fmt.Println("FLAM")
}

В моем capture_payment_test.go файл у меня есть:

package payments

import (
  "testing"
  
  "github.com/myorg/myapp/billing"
  "github.com/myorg/myapp/fulfillment"
)

func TestSomething(t *testing.T) {
  billing.Flim()
  fulfillment.Flam()
}

Когда я cd в server/payments и беги go test Я получаю следующую ошибку:

$ go test
# github.com/myorg/myapp/server/payments [github.com/myorg/myapp/server/payment.test]
./capture_payment_test.go:12:2: undefined: fulfillment.Flam
FAIL    github.com/myorg/myapp/server/payments [build failed]

Кто-нибудь может понять, почему fulfillment.Flam() не определено, но billing.Flim() совершенно нормально?

1 ответ

Решение

Это объясняется в обзоре пакета тестирования:

Чтобы написать новый набор тестов, создайте файл с именем, оканчивающимся на _test.go.... Поместите файл в тот же пакет, что и тестируемый. Файл будет исключен из обычных сборок пакетов...

Это значит, что Flam() не будет частью fulfillmentпакет и не может использоваться из других пакетов. Если вы хотите, чтобы тестовые утилиты использовались другими пакетами, вам нужно поместить их в обычный*.go файлы, а не *_test.go.

Другие вопросы по тегам