Skip to main content

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

接下來就是我要將測試放入現在正在進行的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