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

我正在尝试在下面编写这个测试,其他测试工作正常,但是我在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 - {}

我做错了什么?


慕尼黑5688855
浏览 162回答 1
1回答

烙印99

错误消息是不言自明的。这是您的查询:'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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go