php小編新一為您介紹Gorm刪除子句sqlmock測試。 Gorm是Go語言中優秀的ORM框架,而sqlmock是Gorm的測試工具,用來模擬資料庫操作。在進行Gorm開發時,我們經常需要進行資料庫刪除操作的測試,這時候就可以使用sqlmock來模擬資料庫的刪除操作,以便進行單元測試和整合測試。本文將為您詳細介紹如何使用Gorm和sqlmock進行刪除子句的測試,幫助您更好地進行資料庫相關的開發工作。
問題內容
我有一個 gorm 刪除,回傳結果:
expirationdate := time.now().utc().add(-(48 * time.hour)) var deletedusers users res := gormdb.withcontext(ctx). table("my_users"). clauses(clause.returning{columns: []clause.column{{name: "email"}}}). where("created_at < ?", expirationdate). delete(&deletedusers)
現在有子句的測試總是失敗。例如:
sqlMock.ExpectExec(`DELETE`) .WithArgs(expirationDate) .WillReturnResult(sqlmock.NewResult(1, 1))
接收錯誤:
「使用參數[{name: ordinal:1 value:2023-01-18 06:15:34.694274 0000 utc}] 呼叫查詢'delete from "my_users" where created_at 期望exec 或execcontext 其中:\n - 匹配sql:'delete'\n - 帶有參數:\n 0 - 2023-01-18 06:15:34.694274 0000 utc\ n - 應傳回具有以下內容的結果:\n lastinsertid: 1\n rowsaffected: 1"
我嘗試了許多其他 sqlmock 期望,但他們也有類似的問題。 另外,我們在 expectexec 中沒有回傳值,只有在 expectquery 中... 有人必須用子句測試 gorm 查詢嗎?
解決方法
我能夠成功地管理您的需求。首先,讓我分享我編寫的文件,然後我將引導您完成所有相關更改。這些檔案是用於生產的 repo.go
和用於測試程式碼的 repo_test.go
。
repo.go
#
package gormdelete import ( "context" "time" "gorm.io/gorm" "gorm.io/gorm/clause" ) type users struct { email string } func delete(ctx context.context, gormdb *gorm.db) error { expirationdate := time.now().utc().add(-(48 * time.hour)) var deletedusers users res := gormdb.withcontext(ctx).table("my_users").clauses(clause.returning{columns: []clause.column{{name: "email"}}}).where("created_at < ?", expirationdate).delete(&deletedusers) if res.error != nil { return res.error } return nil }
由於您沒有提供完整的文件,我試圖猜測缺少的內容。
repo_test.go
package gormdelete import ( "context" "database/sql/driver" "testing" "time" "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" "gorm.io/driver/postgres" "gorm.io/gorm" ) // this is taken directly from the docs // https://github.com/DATA-DOG/go-sqlmock#matching-arguments-like-timetime type AnyTime struct{} // Match satisfies sqlmock.Argument interface func (a AnyTime) Match(v driver.Value) bool { _, ok := v.(time.Time) return ok } func TestDelete(t *testing.T) { db, mock, err := sqlmock.New() if err != nil { t.Fatalf("an error was not expected: %v", err) } conn, _ := db.Conn(context.Background()) gormDb, err := gorm.Open(postgres.New(postgres.Config{ Conn: conn, })) row := sqlmock.NewRows([]string{"email"}).AddRow("<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="9febfaecebdffae7fef2eff3fab1fcf0f2">[email protected]</a>") mock.ExpectBegin() mock.ExpectQuery("DELETE FROM \"my_users\" WHERE created_at < ?").WithArgs(AnyTime{}).WillReturnRows(row) mock.ExpectCommit() err = Delete(context.Background(), gormDb) assert.Nil(t, err) if err = mock.ExpectationsWereMet(); err != nil { t.Errorf("not all expectations were met: %v", err) } }
這裡還有更多值得一提的改變:
- 我根據文件實例化了
anytime
(您可以在評論中看到連結)。 - 我再次猜測了
db
、mock
和gormdb
的設置,但我認為它們應該大致相同。 - 我將
expectexec
的用法切換為expectquery
,因為我們將傳回clauses
檔案中repo.go
方法指定的結果集。 - 您必須將
expectquery
包裝在expectbegin
和expectcommit
中。 - 最後,請注意驅動程式對 sql 語句中參數的期望方式的差異。在生產程式碼中,您可以選擇使用
?
或$1
。但在測試程式碼中,只能使用?
,否則不符合預期。
希望能幫一點忙,否則請告訴我!
以上是Gorm 刪除子句 sqlmock 測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang適合快速開發和並發編程,而C 更適合需要極致性能和底層控制的項目。 1)Golang的並發模型通過goroutine和channel簡化並發編程。 2)C 的模板編程提供泛型代碼和性能優化。 3)Golang的垃圾回收方便但可能影響性能,C 的內存管理複雜但控制精細。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版
好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器