Bagaimana untuk mensimulasikan ping db tanpa sqlmock

PHPz
Lepaskan: 2024-02-12 08:27:27
ke hadapan
389 orang telah melayarinya

如何在没有 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
}
Salin selepas log masuk

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
}
Salin selepas log masuk
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)
    }
    
    ...
}
Salin selepas log masuk
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)
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk mensimulasikan ping db tanpa sqlmock. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan