Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk mensimulasikan ping db tanpa sqlmock
Apabila membangunkan perisian, kami sering menghadapi situasi di mana kami perlu mensimulasikan sambungan pangkalan data untuk ujian. Walau bagaimanapun, kadangkala kami mungkin tidak mempunyai alat seperti sqlmock untuk membantu kami mencapai matlamat ini. Jadi, bagaimana kita harus mensimulasikan operasi ping pangkalan data tanpa sqlmock? Dalam artikel ini, editor PHP Youzi akan memperkenalkan anda kepada kaedah yang mudah dan berkesan untuk mencapai matlamat ini, membolehkan anda berjaya menjalankan ujian simulasi sambungan pangkalan data.
Nak tahu cara guna mock.mock
重构我的代码以模拟 db.ping()
. Saya ingin memahami konsep ini tanpa rangka kerja terlebih dahulu.
Ini adalah kod yang saya ingin uji:
func Connect() (*sql.DB, error) { db, err := sql.Open("mysql", "root:secret@tcp(s-maria-db)/s_db") if err != nil { return nil, err } for i := 0; i < 60; i++ { // I am hoping to mock this portion if err := db.Ping(); err == nil { break } time.Sleep(time.Second) } return db, nil }
Saya mencuba artikel ini tentang cara mensimulasikan arahan ping, tetapi itu sebenarnya tidak menjawab soalan. Jika ya, saya tidak faham penyelesaiannya kerana ia berfungsi untuk kod saya.
Anda perlu menggunakan fungsi berasingan untuk ping, dan ia perlu menerima antara muka supaya anda boleh lulus secara bersyarat dalam *sql.db
sebenar atau olok-olok. Ini kerana anda tidak boleh mengatasi kaedah pada struktur.
// connect opens a connection to the database. func connect() (*sql.db, error) { return sql.open("mysql", "root:secret@tcp(s-maria-db)/s_db") } // pinger defines an interface for pinging. type pinger interface { ping() error } // ping attempts to ping the database, trying several times before failing. func ping(p pinger) error { const maxattempts = 60 var err error for i := 0; i < maxattempts; i++ { if err = p.ping(); err == nil { return nil } if i < maxattempts - 1 { time.sleep(time.second) } } return err }
func main() { if err := run(); err != nil { log.fatal(err) } } func run() error { db, err := connect() if err != nil { return fmt.errorf("connecting to db: %w", err) } defer db.close() if err = ping(db); err != nil { return fmt.errorf("pinging db: %w", err) } ... }
type mockDB struct { mock.Mock } func (m *mockDB) Ping() error { args := m.Called() return args.Error(0) } func TestPing(t *testing.T) { db := &mockDB{} db.On("Ping").Return(...) err := Ping(db) ... db.AssertExpectations(t) }
Atas ialah kandungan terperinci Bagaimana untuk mensimulasikan ping db tanpa sqlmock. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!