Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mensimulasikan ping db tanpa sqlmock

Bagaimana untuk mensimulasikan ping db tanpa sqlmock

PHPz
PHPzke hadapan
2024-02-12 08:27:27356semak imbas

如何在没有 sqlmock 的情况下模拟 db ping

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.

Kandungan soalan

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.

Penyelesaian

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam