17

構成ファイルを JSON として解析する単純な関数があります。サンプルの静的構成ファイルを使用して解析するか、テスト中にサンプルを作成して解析を試みるテストを作成したいと考えています。

質問に完全に必要というわけではありませんが、基本的なコードは次のとおりです。

// config.go

// ...(package,imports)...

// Overall settings - corresponds to main.conf
type MainSettings struct {
    // stuff
}

// Load main.conf from the specified file path
func LoadMainSettings(path string) (*MainSettings, error) {

    b, err := ioutil.ReadFile(path)
    if err != nil { return nil, err }

    r := &MainSettings{}
    err = json.Unmarshal(b, r)
    if err != nil { return nil, err }

    return r, nil

}

そしてテスト:

// config_test.go

func TestLoadMainSettings(t *testing.T) {

    // possibly generate some example config files,
    // or use static samples packaged with the source

    s, err := LoadMainSettings("conf/main.conf") // <-- what should this path be??
    if err != nil { panic(err) }

    // more sanity checking...

}

とはいえ、私の具体的な質問は次のとおりです。

  • テストにのみ適用される静的アセット (サンプル構成ファイルなど) の適切な場所はありますか?
  • テストの実行中に、一時ファイルを書き出すための適切な場所 (クロスプラットフォーム、「go clean」でクリーンアップされる) はありますか?

(注:私は、ステージングと本番用にLinuxで、ローカル開発用にMacでほとんどのものを実行します。そのため、テスト用の一時ディレクトリとして/ tmp /を使用すると、実際には機能します。しかし、より良い方法があるかどうか疑問に思っていました...)


編集:テストにこのアプローチを使用することになりました:

f, err := ioutil.TempFile("", "testmainconf")
if err != nil { panic(err) }
defer syscall.Unlink(f.Name())
ioutil.WriteFile(f.Name(), []byte("{...sample config data...}"), 0644)

s, err := LoadMainSettings(f.Name())

しかし、LoadMainSettingsio.Readerが a の代わりにan を受け入れるようにするという他の提案stringも良い考えです。

4

4 に答える 4

10

と比較するとioutil.TempDir、次のようになりio.Readerます。

// Load main.conf from the specified file path
func LoadMainSettings(src io.Reader) (*MainSettings, error) {
    b, err := ioutil.ReadAll(src)
    if err != nil { return nil, err }

    r := &MainSettings{}
    err = json.Unmarshal(b, r)
    if err != nil { return nil, err }

    return r, nil
}

具体的には、引数をpath文字列からインスタンスに変更しsrc io.Reader、 を に置き換えます。ioutil.ReadFileioutil.ReadAll

あなたが書いたテストケースは、ファイル操作を省略できるため、少し短くなります。

s, err := LoadMainSettings(strings.NewReader("{...sample config data...}"))
于 2013-09-30T05:05:06.653 に答える