【Golang】filepath.Abs で error を発生させたい(テスト用のエラー・ケースが欲しい)
解決したいこと
filepath.Abs()
を使った関数のテストで、Abs()
がエラーを返すパターンが作れないか悩んでいます。
何を与えてもパースできちゃうのでパスしてしまうのです。エラーが欲しいのに。
if path, err := filepath.Abs("<エラーにしたいパス>"); err != nil {
// Do something on failure
// ここにたどりつかない
} else {
// Do something on success
}
微妙〜にカバレッジが網羅できず気持ちが悪いのでアイデアがないかお伺いしたいです。
- テストは Docker の(
golang:1.17-alpine
) コンテナ上で実行しているので Linux 環境でerror
を返してくれるだけで嬉しいです。
該当するソースコード
package main
import (
"path/filepath"
"testing"
)
func DoSomething(path string) (string, error) {
pathAbs, err := filepath.Abs(path)
if err != nil {
return "", err // ここにたどり着けない
}
return pathAbs, nil
}
func TestDoSomething(t *testing.T) {
for _, test := range []struct {
input string
expectOut string
expectErr bool
}{
{"..", "/", false},
{"<ここが欲しい>", "", true},
} {
actualOut, err := DoSomething(test.input)
// Case assert error
if test.expectErr && err == nil {
t.Fatalf("it should return an error: %v", test.input)
}
// Case assert equal
if test.expectOut != actualOut {
t.Fatalf("it should return: %#v, got: %#v", test.input, actualOut)
}
}
}
- オンラインで動作を見る @ Go Playground
【結論】
filepath.Abs()
はエラーを返さないため、filepathAbs := filepath.Abs
と変数に代入しておき、テスト時にエラーを返す関数を一時的に割り当てる、モンキー・パッチする方法に落ち着きました。(回答参照)
0