godotenvのコードをみるとロードするファイル名を省略した場合は
カレントフォルダにある".env"ファイルが読み込み対象です。
「go run」するときはカレントフォルダを参照しますのでmain.goのあるフォルダで「go run」したのでしょう。その場合.envがみつかります。
「go test」した時は各パッケージフォルダにカレントディレクトリが切り替えられてからテスト処理が実行されます。なのでパッケージフォルダに.envがない場合に存在しないというエラーになるのでしょう。
カレントフォルダに依存するファイルローダーはメインパッケージフォルダを想定しておかないといろいろ面倒になります。なのでサブパッケージのテスト実装でローダーが実行されるようにするのはNGでしょう。
メインパッケージで読み込んだ情報をresponderパッケージで参照するように設計する時は
「準備の段階でresponderに読み込んだ情報を渡す」方が良いでしょう。
go
1func main() {
2 err := godotenv.Load()
3 if err != nil {
4 log.Fatal("Error loading .env file")
5 }
6
7 s3Bucket := os.Getenv("S3_BUCKET")
8 secretKey := os.Getenv("SECRET_KEY")
9
10 r := responder.New(s3Bucket, secretKey)
11 ...
12}
そしてテストでは本番に使う.envを使わないのが一般的です。「準備の段階でresponderに読み込んだ情報を渡す」時の情報にダミーを渡してテストを実装しましょう。
responder_test.go
go
1func TestResponder(t *testing.T) {
2 r := New("dummy_bucket/uri", "dummy_secret")
3 ...
4}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。