LoginSignup
1
0

More than 1 year has passed since last update.

Gomega エラーメッセージが分かりやすいEqual Matcherを作った

Posted at

作ったもの

動機

仕事で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化しただけ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0