Basic go-testdeep approach

td package, via its Cmp* functions, handles the tests and all the error message boiler plate. Let’s do it:

import (
  "testing"
  "time"

  "github.com/maxatome/go-testdeep/td"
)

func TestCreateRecord(t *testing.T) {
  before := time.Now().Truncate(time.Second)
  record, err := CreateRecord("Bob", 23)

  if td.CmpNoError(t, err) {
    td.Cmp(t, record.Id, td.NotZero(), "Id initialized")
    td.Cmp(t, record.Name, "Bob")
    td.Cmp(t, record.Age, 23)
    td.Cmp(t, record.CreatedAt, td.Between(before, time.Now()))
  }
}

Test it in playground: https://play.golang.org/p/bfe-aj_gx8Q

As we cannot guess the Id field value before its creation, we use the NotZero operator to check it is set by CreateRecord() call. The same is true for the creation date field CreatedAt. Thanks to the Between operator we can check it is set with a value included between the date before CreateRecord() call and the date just after.

Note that if Id and CreateAt could be known in advance, we could simply do:

import (
  "testing"
  "time"

  "github.com/maxatome/go-testdeep/td"
)

func TestCreateRecord(t *testing.T) {
  record, err := CreateRecord("Bob", 23)

  if td.CmpNoError(t, err) {
    td.Cmp(t, record, &Record{
        Id:        1234,
        Name:      "Bob",
        Age:       23,
        CreatedAt: time.Date(2019, time.May, 1, 12, 13, 14, 0, time.UTC),
      })
  }
}

But unfortunately, it is common to not know exactly the value of some fields…