-1

我正在尝试检查返回的数据是否等于预期

这是我的功能:

func extractData(payload string) (interface{}, time.Time, error) {

    eventTime := gjson.Get(payload, "data.eventDateTime").String()

    dateTime, err := time.Parse("2006-01-02T15:04:05-07:00", eventTime)
    if err != nil {
        return nil, time.Time{}, fmt.Errorf("Date Time Error: %w", err)
    }

    body := data.Body{
        EventTime: dateTime,
    }

    return body, dateTime, nil
}

这是我为它编写的单元测试:

func TestExtractData(t *testing.T) {

    tests := []struct {
        Name           string
        Payload        string
        ExpectedOutput interface{}
    }{
        {
            Name:    "test-2",
            Payload: "{\"data\":\"2020-11-02T10:44:48+01:00\"}",
            ExpectedOutput: data.Body{
                EventTime: time.Date(2020, 11, 2, 10, 44, 48, 0, time.FixedZone("CET", 3600)),
            },
        },
    }

    for _, tt := range tests {
        t.Run(tt.Name, func(t *testing.T) {
            data, _, _ := extractData(tt.Payload)
            assert.Equal(t, tt.ExpectedOutput, data)
        })
    }
}

测试失败,它输出:

{ 2020-11-02 10:44:48 +0100 CET} does not equal { 2020-11-02 10:44:48 +0100 CET}

我相信问题出在TimeZone,但我很难编写测试代码。

我不想使用 测试它time.Equal,因为 mydata.Body并不总是包含该eventTime元素。

我试过(通过临时使用类型而不是接口):

if !tt.ExpectedOutput.EventTime.Equal(data.EventTime) {
    //throw error
}

它有效。

我也试过:

if !reflect.DeepEqual(tt.ExpectedOutput.EventTime, data.EventTime) {
    t.Errorf("extractData() output = %v, want = %v",data,tt.ExpectedOutput)
}

上面的代码失败了。

4

1 回答 1

1

您部分正确的是,时区可以使time.Time代表同一时间的两个实例失败相等。也可能是因为从 go 1.9 开始time.Time还包括 wall time 以使所有比较安全,time.Time因此诸如您的ExpectedOutput字段之类的文字将永远不会包含此 wall time,因此是“不同的”。

您最好的解决方案可能是比较使用时间assert.WithinDuration()(我假设您正在使用github.com/stretchr/testify/assert?):

package kata

import (
    "testing"
    "time"

    "github.com/stretchr/testify/assert"
)

func TestTime(t *testing.T) {
    format := "2006-01-02 15:04:05.999999999 -0700 MST"
    time1 := time.Now()
    time2, err := time.Parse(format, time1.Format(format))
    assert.NoError(t, err)
    t.Log(time1)
    t.Log(time2)
    assert.Equal(t, time1, time2)             // fails
    assert.WithinDuration(t, time1, time2, 0) // passes
}

于 2021-09-28T13:20:39.733 回答