13

現在のディレクトリ構造は次のようになります。

App
  - Template
    - foo.go
    - foo.tmpl
  - Model
    - bar.go
  - Another
    - Directory
      - baz.go

ファイルは、実行中にテンプレート ファイルを読み込むためにfoo.go使用します。ParseFilesinit

import "text/template"

var qTemplate *template.Template

func init() {
  qTemplate = template.Must(template.New("temp").ParseFiles("foo.tmpl"))
}

...

期待どおりに機能するための単体テストfoo.gobar.goしかし、私は今、とbaz.goの単体テストを実行foo.goしようとしていますfoo.tmpl

/App/Model$ go test    
panic: open foo.tmpl: no such file or directory

/App/Another/Directory$ go test    
panic: open foo.tmpl: no such file or directory

テンプレート名を相対ディレクトリ (「./foo.tmpl」)、完全なディレクトリ (「~/go/src/github.com/App/Template/foo.tmpl」)、App 相対として指定しようとしました。ディレクトリ(「/App/Template/foo.tmpl」)などがありますが、どちらの場合も機能しないようです。単体テストは、どちらbar.gobaz.go(または両方) で失敗します。

ParseFilesどのディレクトリから呼び出すかに関係なく、常にテンプレート ファイルを見つけることができるようにするには、テンプレート ファイルをどこに配置し、どのように呼び出す必要がありますgo testか?

4

1 に答える 1

16

役立つヒント:

os.Getwd()およびを使用しfilepath.Join()て、相対ファイル パスの絶対パスを検索します。

// File: showPath.go
package main
import (
        "fmt"
        "path/filepath"
        "os"
)
func main(){
        cwd, _ := os.Getwd()
        fmt.Println( filepath.Join( cwd, "./template/index.gtpl" ) )
}

まず、templateフォルダにはプレゼンテーション用のテンプレートのみを含め、go ファイルは含めないことをお勧めします。

次に、作業を楽にするために、ルート プロジェクト ディレクトリからのみファイルを実行します。これは、サブディレクトリ内にネストされた go ファイル全体で、ファイルへのパスを一貫させるのに役立ちます。相対ファイル パスは、現在の作業ディレクトリ (プログラムが呼び出された場所) から始まります。

現在の作業ディレクトリの変更を示す例

user@user:~/go/src/test$ go run showPath.go
/home/user/go/src/test/template/index.gtpl
user@user:~/go/src/test$ cd newFolder/
user@user:~/go/src/test/newFolder$ go run ../showPath.go 
/home/user/go/src/test/newFolder/template/index.gtpl

テスト ファイルに関しては、ファイル名を指定することで個々のテスト ファイルを実行できます。

go test foo/foo_test.go

最後に、ベース パスとpath/filepathパッケージを使用してファイル パスを形成します。

例:

var (
  basePath = "./public"
  templatePath = filepath.Join(basePath, "template")
  indexFile = filepath.Join(templatePath, "index.gtpl")
) 
于 2013-12-06T05:55:37.277 に答える