Heim > Backend-Entwicklung > Golang > So verspotten Sie eine Netconf-Sitzung beim Unit-Testen von Golang

So verspotten Sie eine Netconf-Sitzung beim Unit-Testen von Golang

WBOY
Freigeben: 2024-02-12 15:42:16
nach vorne
879 Leute haben es durchsucht

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

Frageninhalt

Ich verwende das Netconf-Paket von Juniper („github.com/juniper/go-netconf/netconf“), um eine Netconf-Sitzung in meinem Code einzurichten.

Ich möchte wissen, wie man eine Netconf-Sitzung in einem Unit-Test simuliert.

Meine Methode ist:

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)
    }
}
Nach dem Login kopieren
func mockgetsshconnection() (*netconf.session, error) {
    var sess netconf.session
    sess.sessionid = 123
    return &sess, nil
}
Nach dem Login kopieren

Das Problem tritt auf, wenn myfunction() eine Zeile enthält, die sess.close() verzögert und aufgrund der Nullzeiger-Dereferenzierung einen Fehler auslöst

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
}
Nach dem Login kopieren

Welche Änderungen kann ich also an der Methode „mockgetsshconnection()“ vornehmen, damit sess.close() keinen Fehler auslöst? Simulieren und verwenden Sie es in realen Beispielen von

Lösung

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

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
}
Nach dem Login kopieren

Bitte beachten Sie, dass die Funktion, die Sie testen möchten, derzeit 0 而不是会话的 sessionid zurückgibt. Daher sollten Sie das Problem beheben, bevor der Test erfolgreich ist.

Das obige ist der detaillierte Inhalt vonSo verspotten Sie eine Netconf-Sitzung beim Unit-Testen von Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage