読者です 読者をやめる 読者になる 読者になる

GoConveyでerror型をテストする時に気をつける事

こんにちは。何号だっけ・・・。

Goでアプリを書いている時にテストでGoConvey

smartystreets/goconvey · GitHub

Go用テストツールGoConveyの紹介 - Qiita

を使っているんですが、error型の比較時に軽くハマったのでメモです。

単純な文字列比較であれば

So(hogehoge, ShouldEqual, "fugafuga")

の様に比較出来るのですが、error型でエラーメッセージが入っているからそれを比較しようと

So(errorObject, ShouldEqual, "error message")

とやると、実際にerrorObjectの中に"error message"が入っていて文字列として等価でもgo test実行するとこんな感じの

Failures:

  * /tmp/test.go
  Line 4:
  Expected: 'error message'
  Actual:   'error message'
  (Should be equal)

というエラーになってしまいます。

じゃあ、比較する側もerror型にしてみれば良いだろ、と

So(errorObject, ShouldEqual, errors.New("error message"))

とやってもこれもダメです。

ではどうすれば良いのかというと

errorMessage := errors.New("error message")
So(errorObject.Error(), ShouldEqual, errorMessage.Error())

と記述する事で比較出来ました。おそらく初めの比較はerror型とstringの比較になってしまっているのかなと思いますが、2個めの比較はおそらくerror型ではあるが同一オブジェクトでは無いという判定になっていると思います。3個目は出力された物としてお互い比較が出来ているから想定しているエラーメッセージのテストが出来ました。


追記 自分で書いておきながら

So(errorObject.Error(), ShouldEqual, "error message")

を試していませんでしたが、これもpassしました。こっちの方が簡潔ですね。