为了账号安全,请及时绑定邮箱和手机立即绑定

调用回滚事务,不是预期的,下一个预期是:ExpectedQuery

调用回滚事务,不是预期的,下一个预期是:ExpectedQuery

Go
慕尼黑5688855 2023-01-03 09:46:43
我正在尝试在下面编写这个测试,其他测试工作正常,但是我在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


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信