Go Can';无法让测试为INSERT语句工作
我们花了两周的时间尝试使用sqlmock对函数和方法进行各种可能的排列,但无法对INSERT语句进行测试。这是非常基本的夫妻SQL。只需使用Gorm进行简单的插入 要发布的代码太多,错误和方法的排列也太多,这里要列出,但我会发布最新的Go Can';无法让测试为INSERT语句工作,go,go-gorm,go-sqlmock,Go,Go Gorm,Go Sqlmock,我们花了两周的时间尝试使用sqlmock对函数和方法进行各种可能的排列,但无法对INSERT语句进行测试。这是非常基本的夫妻SQL。只需使用Gorm进行简单的插入 要发布的代码太多,错误和方法的排列也太多,这里要列出,但我会发布最新的 type AnyTime struct{} func (a AnyTime) Match(v driver.Value) bool { _, ok := v.(time.Time) return ok } func TestInsertStor
type AnyTime struct{}
func (a AnyTime) Match(v driver.Value) bool {
_, ok := v.(time.Time)
return ok
}
func TestInsertStoragePool(t *testing.T) {
cases := []struct {
givenPool StoragePool
wantedError error
}{
{
givenPool: StoragePool{
Name: "POOL1",
PoolId: "1",
Type: "NetworkFilesystem",
Volumes: []Volume{
{
Name: "VOL01",
StorageId: "1",
Type: "ROOT",
VolumeId: "1",
},
},
},
wantedError: nil,
},
}
for _, c := range cases {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatal(err)
}
// Every attempt we make we try "Postgres", "mysql" and "sqlite3" here
DB, err := gorm.Open("sqlite3", db)
if err != nil {
t.Fatal(err)
}
DB.LogMode(true)
mock.ExpectBegin()
mock.ExpectExec(`INSERT INTO "storage_pools"`).WithArgs(
AnyTime{},
AnyTime{},
nil,
0,
0,
"",
"",
"",
0,
0,
0,
"",
c.givenPool.Name,
"",
0,
"",
"",
c.givenPool.PoolId,
"",
"",
"",
c.givenPool.Type,
"",
"").WillReturnResult(sqlmock.NewResult(1, 1))
mock.ExpectCommit()
err = InsertStoragePool(DB, &c.givenPool)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
}
if !reflect.DeepEqual(err, c.wantedError) {
t.Errorf("expecting errror %q, got %q", c.wantedError, err)
}
}
}
此尝试产生的错误:
$go test ./...
(/database.go:231)
[2019-12-13 09:22:48] [0.11ms] INSERT INTO "storage_pools" ("created_at","updated_at","deleted_at","allocatediops","capacityiops","clusterid","clustername","created","disksizeallocated","disksizetotal","disksizeused","ipaddress","name","path","physicalsize","podid","podname","poolid","provider","scope","state","type","zoneid","zonename") VALUES ('2019-12-13 09:22:48','2019-12-13 09:22:48',NULL,0,0,'','','',0,0,0,'','POOL1','',0,'','','1','','','','NetworkFilesystem','','')
[1 rows affected or returned ]
(/database.go:231)
[2019-12-13 09:22:48] call to ExecQuery 'INSERT INTO "volumes" ("created_at","updated_at","deleted_at","clusterid","clustername","domainid","domain","name","path","physicalsize","podid","podname","size","state","storageid","storage","type","virtualsize","virtualmachineid","vmdisplayname","vmname","vmstate","volumeid","zoneid","zonename") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' with args [{Name: Ordinal:1 Value:2019-12-13 09:22:48.093749 -0800 PST m=+0.004941653} {Name: Ordinal:2 Value:2019-12-13 09:22:48.093749 -0800 PST m=+0.004941653} {Name: Ordinal:3 Value:<nil>} {Name: Ordinal:4 Value:} {Name: Ordinal:5 Value:} {Name: Ordinal:6 Value:} {Name: Ordinal:7 Value:} {Name: Ordinal:8 Value:VOL01} {Name: Ordinal:9 Value:} {Name: Ordinal:10 Value:0} {Name: Ordinal:11 Value:} {Name: Ordinal:12 Value:} {Name: Ordinal:13 Value:0} {Name: Ordinal:14 Value:} {Name: Ordinal:15 Value:1} {Name: Ordinal:16 Value:} {Name: Ordinal:17 Value:ROOT} {Name: Ordinal:18 Value:0} {Name: Ordinal:19 Value:} {Name: Ordinal:20 Value:} {Name: Ordinal:21 Value:} {Name: Ordinal:22 Value:} {Name: Ordinal:23 Value:1} {Name: Ordinal:24 Value:} {Name: Ordinal:25 Value:}], was not expected, next expectation is: ExpectedCommit => expecting transaction Commit
$go测试。/。。。
(/database.go:231)
[2019-12-13 09:22:48][0.11ms]在“存储池”中插入(“创建于”、“更新于”、“删除于”、“分配操作”、“容量操作”、“群集ID”、“群集名称”、“创建的”、“DiskSizeAllocate”、“disksizetotal”、“disksizeused”、“ipaddress”、“名称”、“路径”、“物理大小”、“PODD”、“PODDNAME”、“池ID”、“提供者”、“范围”、“状态”、“类型”、“分区ID”、“分区名称”)值('2019-12-13 09:22:48','2019-12-13 09:22:48',NULL,0,0','','','','',0,0',,'POOL1','',0',,'','','','1','','','','','','','NetworkFilesystem','')
[1行受影响或返回]
(/database.go:231)
[2019-12-13 09:22:48]调用ExecQuery'插入“卷”(“在创建时”、“在更新时”、“在删除时”、“群集ID”、“群集名称”、“域名”、“域名”、“路径”、“物理大小”、“PODD”、“podname”、“大小”、“状态”、“存储ID”、“存储”、“类型”、“虚拟化”、“虚拟机ID”、“vmdisplayname”、“vmname”、“vmstate”、“volumeid”、“zoneid”、“zonename”)值,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,....................与.................与....................................................................................名称:序号:7值:}{Name:Ordinal:8值:VOL01}{Name:Ordinal:9值:}{Name:Ordinal:10值:0}{Name:Ordinal:11值:}{Name:Ordinal:12值:}{Name:Ordinal:13值:0}{Name:Ordinal:14值:}{Name:Ordinal:15值:1}{Name:Ordinal:16值:}{Name:17值:根}{Name:Ordinal:18值:0}{Name:Ordinal:20}{Name:Ordinal:21值:}{Name:Ordinal:22值:}{Name:Ordinal:23值:1}{Name:Ordinal:24值:}{Name:Ordinal:25值:}],不应为空,下一个应为:ExpectedCommit=>应为事务提交
错误消息告诉您,在您预期的插入之后,正在执行另一个插入:
不希望插入到“卷”(…)中,下一个期望是:ExpectedCommit
在您的代码中,我们可以看到您的StoragePool
struct在一个切片中还有一些卷
因此,可能在调用InsertStoragePool
时,首先将一行插入storagepool
,然后插入卷
在添加提交期望之前,您应该为该插入添加新的期望。错误消息告诉您,在您期望的插入之后正在执行另一个插入:
不希望插入到“卷”(…)中,下一个期望是:ExpectedCommit
在您的代码中,我们可以看到您的StoragePool
struct在一个切片中还有一些卷
因此,可能在调用InsertStoragePool
时,首先将一行插入storagepool
,然后插入卷
在添加提交期望之前,应该为该插入添加新期望