Bagaimana untuk mengejek sesi netconf dalam ujian unit Golang

WBOY
Lepaskan: 2024-02-12 15:42:16
ke hadapan
858 orang telah melayarinya

如何在单元测试 Golang 中模拟 netconf 会话

Kandungan soalan

Saya menggunakan pakej netconf juniper ("github.com/juniper/go-netconf/netconf") untuk mewujudkan sesi netconf dalam kod saya.

Saya ingin tahu cara mensimulasikan sesi netconf dalam ujian unit.

Kaedah saya ialah:

func testmyfunction(t *testing.t) {
    getsshconnection = mockgetsshconnection
    got := myfunction()
    want := 123
    if !reflect.deepequal(got, want) {
        t.errorf("error expectation not met, want %v, got %v", want, got)
    }
}
Salin selepas log masuk
func mockgetsshconnection() (*netconf.session, error) {
    var sess netconf.session
    sess.sessionid = 123
    return &sess, nil
}
Salin selepas log masuk

Masalah timbul apabila myfunction() mempunyai garisan yang melambatkan sess.close() dan melemparkan ralat akibat penyahrujukan penunjuk nil

func MyFunction() int {
    sess, err := getSSHConnection() // returns (*netconf.Session, error)
    if err == nil && sess != nil {
        defer sess.Close() -> Problem happens here
        // Calls RPC here and rest of the code here
        
    } 
    return 0
}
Salin selepas log masuk

Jadi, apakah perubahan yang boleh saya lakukan pada kaedah mockgetsshconnection() supaya sess.close() tidak menimbulkan ralat? Simulasikan dan gunakannya dalam contoh sebenar

Penyelesaian

nil 指针错误源自 close 函数 当底层transport调用close时。幸运的是 transport 是一个 interface 类型,您可以轻松地在 netconf.session. Contohnya seperti ini:

type MockTransport struct{}

func (t *MockTransport) Send([]byte) error {
    return nil
}

func (t *MockTransport) Receive() ([]byte, error) {
    return []byte{}, nil
}

func (t *MockTransport) Close() error {
    return nil
}

func (t *MockTransport) ReceiveHello() (*netconf.HelloMessage, error) {
    return &netconf.HelloMessage{SessionID: 123}, nil
}

func (t *MockTransport) SendHello(*netconf.HelloMessage) error {
    return nil
}

func (t *MockTransport) SetVersion(version string) {
}

func mockGetSSHConnection() (*netconf.Session, error) {
    t := MockTransport{}
    sess := netconf.NewSession(&t)
    return sess, nil
}
Salin selepas log masuk

Sila ambil perhatian bahawa fungsi yang anda ingin uji kini kembali 0 而不是会话的 sessionid . Oleh itu, anda harus membetulkan isu tersebut sebelum ujian berjaya.

Atas ialah kandungan terperinci Bagaimana untuk mengejek sesi netconf dalam ujian unit Golang. 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