作ったもの
動機
仕事でGoのテストライブラリとしてGinkgo/Gomegaを使っているのだが、Gomegaに組み込まれているEqual Matcherは、エラーメッセージが分かりづらい。
以下のようなテストコードがあるとする。gomegaのEqual Matcherにより2つの構造体を比較し、結果が同じになるか検証している。
var _ = Describe("Example", func() {
It("Example", func() {
actual := Object{ID: 1, Name: "actual", Tel: "Tel", Email: "Email"}
expected := Object{ID: 1, Name: "expected", Tel: "Tel", Email: "Email"}
Expect(actual).Should(Equal(expected))
})
})
比較対象のNameの値に差異があるのでエラーになる。このときのエラーメッセージは以下の通り。
Expected
<equalcmp_test.Object>: {ID: 1, Name: "actual", Tel: "Tel", Email: "Email"}
to equal
<equalcmp_test.Object>: {ID: 1, Name: "expected", Tel: "Tel", Email: "Email"}
Nameが違うことが分かりづらい。
このモジュールが提供するEqual Matcher
EqualCmpという名前でEqual Matcherを提供している。EqualCmpを使ったサンプルコードを示す。
gomegaのEqual()をEqualCmpに置き換えるだけ。
import (
"testing"
. "github.com/kamikazezirou/equal-cmp"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)
...
var _ = Describe("Example", func() {
It("Example", func() {
actual := Object{ID: 1, Name: "actual", Tel: "Tel", Email: "Email"}
expected := Object{ID: 1, Name: "expected", Tel: "Tel", Email: "Email"}
Expect(actual).Should(EqualCmp(expected))
})
})
EqualCmpのエラーメッセージは以下のとおり。
Mismatch(-actual +expected):
equalcmp_test.Object{
ID: 1,
- Name: "actual",
+ Name: "expected",
Tel: "Tel",
Email: "Email",
}
差分箇所が分かりやすくなった。
備考:実現方法
実際値と期待値の比較にgo-cmpを使うことで、このモジュールは実現している。
元ネタはこちら。このコードのエラーメッセージを調整して、module化しただけ。