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