iT邦幫忙

2021 iThome 鐵人賽

1
Software Development

網頁新手入門,手把手用React/Golang(Echo)開發基礎網頁(以簡易智慧家庭為例)系列 第 21

建立第一個單元測試(golang)-2(Day21)

接下來就是我要將測試放入現在正在進行的api中了

在這次的測試中,我想測試mRequest.Get()會不會回傳資料庫的所有request的值

而這次測試中,mRequest.Get()十分的單純

func (r *MRequest) Get() (requests []Request, err error) {
	if findErr := r.db.Find(&requests).Error; findErr != nil {
		err = findErr
		return
	}
	return
}

而要預期資料庫會不會回傳所有的值,最直接的就是看,他有沒有執行

select * from requests

只要執行了這段sql,就表示他在正常連線下可以取得requests的所有資料

那接著,我們要用
https://github.com/DATA-DOG/go-sqlmock
來對gorm進行mock
這個lib可以對大部分的sql的資料庫進行mock,所以就不用自己重新製造輪子來mock裡面的method了,而詳細的用法可以到上述連結中進行查詢
而我們這次使用的是ExpectQuery這個method,他可以幫你檢查你是否有執行你想要的sql語法
用法如下

const sqlSelectAll = `SELECT * FROM "requests"`
mock.ExpectQuery(regexp.QuoteMeta(sqlSelectAll)).WillReturnRows(sqlmock.NewRows(nil))
_, err := r.Get()
Expect(err).ShouldNot(HaveOccurred())

這樣就可以檢查到他是否有執行SELECT * FROM "requests"這段內容了

至於說為什麼要使用regexp.QuoteMeta()這個method,是因為ExpectQuery中,他預設會認爲裡面的內容是正規表達式,所以在這句sql語法中的*跟正規表達式裡面的符號衝到了,因此如果想要預期裡面直接是字串符合的話,就要加上regexp.QuoteMeta()來讓你直接是跟這段內容相符,當然你也可以將判斷句改為

select \* from "requests"

這樣也是可以的

接著只要到model的資料夾下執行

go test .

或是到最外面執行

go test ./...

就可以看到這次測試的結果摟

以下附上這次的commit紀錄
https://github.com/kevinyay945/smart-home-backend/tree/v0.3.1


上一篇
建立第一個單元測試(golang)-1(Day20)
下一篇
重構原本的內容(golang)(Day22)
系列文
網頁新手入門,手把手用React/Golang(Echo)開發基礎網頁(以簡易智慧家庭為例)28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
qaz85954826
iT邦新手 5 級 ‧ 2021-12-10 17:13:04

請問還有再做下去嗎?對這篇很感興趣

我要留言

立即登入留言