我正在尝试在下面编写这个测试,其他测试工作正常,但是我在UPDATE查询时遇到问题func TestDeleteWorkspace(t *testing.T) { conn, mock, repository, err := setup() defer conn.Close() assert.NoError(t, err) uid := uuid.New() // mock.ExpectBegin() mock.ExpectQuery(regexp.QuoteMeta(`UPDATE "workspaces" SET`)).WithArgs(sqlmock.AnyArg(), uid) // mock.ExpectCommit() var e bool e, err = repository.Delete(uid) assert.NoError(t, err) assert.True(t, e) err = mock.ExpectationsWereMet() assert.NoError(t, err)}repository.Delete做这个查询func (r *WorkspaceRepository) Delete(id any) (bool, error) { if err := r.db.Delete(&model.Workspace{}, "id = ?", id).Error; err != nil { return false, nil } return true, nil}哪个运行此查询UPDATE "workspaces" SET "deleted_at"='2022-07-04 09:09:20.778' WHERE id = 'c4610193-b43a-4ed7-9ed6-9d67b3f97502' AND "workspaces"."deleted_at" IS NULL我正在使用Soft-Delete,这就是为什么它是 UPDATE 而不是 DELETE 查询但是,我收到以下错误 workspace_test.go:169: Error Trace: workspace_test.go:169 Error: Received unexpected error: there is a remaining expectation which was not matched: ExpectedQuery => expecting Query, QueryContext or QueryRow which: - matches sql: 'UPDATE "workspaces" SET' - is with arguments: 0 - 28e7aa46-7a22-4dc7-b3ce-6cf02af525ca 1 - {}我做错了什么?
1 回答
烙印99
TA贡献1829条经验 获得超13个赞
错误消息是不言自明的。
这是您的查询:
'UPDATE "workspaces" SET "deleted_at"=$1 WHERE id = $2 AND "workspaces"."deleted_at" IS NULL'
它包括 2 个参数:
"deleted_at"=$1 WHERE id = $2
您在 SQL 模拟中仅设置 1 :
.WithArgs(uid)
您需要在模拟中发送两个参数。
在测试中使用它是不可靠的,Time.Now()
因为该值偶尔会与您在代码中设置的值相差几纳秒,并且测试将失败。
快速而肮脏的解决方法是使用sqlmock.AnyArg()
:
.WithArgs(sqlmock.AnyArg(), uid)
一个更复杂的替代方法是编写Argument
检查类型并将值与time.Now()
. 差异应小于几秒钟。
看一个例子:https ://github.com/DATA-DOG/go-sqlmock#matching-arguments-like-timetime
- 1 回答
- 0 关注
- 104 浏览
添加回答
举报
0/150
提交
取消