bson.M {} deepequal似乎不支持int32。

问题描述 投票:1回答:1

我有一个函数,用于比较两个结构,并制作一个bson文档作为mongodb updateOne()的输入。

结构格式示例

type event struct {
    ...
    Name           string
    StartTime      int32
    ... 
}

Diff函数,请忽略我还没有检查出没有差异。

func diffEvent(e event, u event) (bson.M, error) {
    newValues := bson.M{}       
    if e.Name != u.Name {
        newValues["name"] = u.Name      
    }

    if e.StartTime != u.StartTime {
        newValues["starttime"] = u.StartTime        
    }

    ... 
    return bson.M{"$set": newValues}, nil   
}

然后我生成了这样一个测试函数。

func Test_diffEvent(t *testing.T) {
    type args struct {
        e event
        u event
    }
    tests := []struct {
        name    string
        args    args
        want    bson.M
        wantErr bool
    }{      
        {
            name: "update startime",
            args: args{
                e: event{StartTime: 1},
                u: event{StartTime: 2},
            },
            want:    bson.M{"$set": bson.M{"starttime": 2}},
            wantErr: false,
        },
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got, err := diffEvent(tt.args.e, tt.args.u)
            if (err != nil) != tt.wantErr {
                t.Errorf("diffEvent() error = %v, wantErr %v", err, tt.wantErr)
                return
            }
            if !reflect.DeepEqual(got, tt.want) {
                t.Errorf("diffEvent() = %v, want %v", got, tt.want)
            }
        })
    }
}

这个失败的原因是

 --- FAIL: Test_diffEvent/update_startime (0.00s)
        models_test.go:582: diffEvent() = map[$set:map[starttime:2]], want map[$set:map[starttime:2]]

对我来说,这似乎是一样的。我玩了一圈,bool字段、字符串字段、枚举字段、结构体字段或结构体数组字段似乎都能用deepequal正常工作,但对于int32字段却给出了一个错误。

作为一个围棋初学者,我到底遗漏了什么?我认为如果boolstring可以工作,那么int32也可以。

mongodb unit-testing go bson
1个回答
2
投票

This:

bson.M{"starttime": 2}

设置 "starttime" 键的字面值 2. 2 是一个无类型的整数常量,由于没有提供类型,所以将使用其默认类型,即 int.

而存储在接口值中的2个值,只有当存储在它们中的动态值的类型和值相同时,才是相等的。所以一个值 2int 类型不能等于一个值 2 类型 int32.

使用显式类型来告诉你要指定的值为 int32 种类:

bson.M{"starttime": int32(2)}
© www.soinside.com 2019 - 2024. All rights reserved.