mongodb - bson.M {} deepequal 似乎无法处理 int32

标签 mongodb unit-testing go bson

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

示例结构格式

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

差异功能,请忽略我还没有检查没有差异。
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 字段的错误。

作为初学者;我在这里想念什么?我假设如果 bool/string 有效,那么 int32 也可以。

最佳答案

这:

bson.M{"starttime": 2}

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

只有存储在接口(interface)值中的动态值具有相同的类型和值时,存储在接口(interface)值中的 2 个值才相等。所以一个值2int类型不能等于值 2类型 int32 .

使用显式类型告诉您要指定 int32 的值类型:
bson.M{"starttime": int32(2)}

关于mongodb - bson.M {} deepequal 似乎无法处理 int32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62258509/

相关文章:

javascript - 将图像添加到 AngularJS 中的列表项

node.js - $limit 和 $skip 在 MongoDB 聚合管道中作为可选

javascript - Node.js:从 Mongoose 查询返回正确的 JSON

python - 大内存 Python 后台作业

python - 用于测试和开发的模拟 python http 请求

go - 如何 "bridge"writer 和 reader in go

unit-testing - 如何在 JEST 测试中模拟全局 Vue.js 变量

javascript - 测试传单插件中用于绘制叠加的私有(private)函数(karma/jasmine)

c - _file_ 或 _line_ 在 golang 中类似

go - 如何让 Go 接受网络请求